1 Markdown
가이드는 GitHub Flavored Markdown으로 작성됩니다. Markdown에 대한 포괄적인 문서와 치트시트가 있습니다.
2 서문
각 가이드는 상단에 동기 부여 텍스트로 시작해야 합니다(파란색 영역의 짧은 소개글입니다). 서문은 가이드가 무엇에 대한 것이고 독자가 무엇을 배우게 될지 설명해야 합니다. 예시로 Routing 가이드를 참조하세요.
3 제목
모든 가이드의 제목은 h1
제목을 사용합니다; 가이드 섹션은 h2
제목을 사용합니다; 하위 섹션은 h3
제목을 사용합니다; 기타 등등. 생성된 HTML 출력은 <h2>
로 시작하는 제목 태그를 사용한다는 점에 유의하세요.
죄송하지만 번역할 실제 내용이 제공되지 않았습니다. Rails 가이드 문서의 실제 내용을 공유해 주시면 번역을 도와드리겠습니다.
3.1 Sub Section을 그대로 한글로 번역해드리면 의미가 모호해질 수 있습니다. 원문을 공유해주시면 정확한 맥락을 파악하여 번역해드리겠습니다.
제목을 작성할 때는 전치사, 접속사, 내부 관사, "to be" 동사의 형태를 제외한 모든 단어를 대문자로 시작하세요:
#### Components 내부의 Assertion과 Job 테스팅
#### Middleware Stack은 Array임
#### 객체가 저장되는 시점은 언제인가?
```markdown
일반 텍스트와 동일한 인라인 서식을 사용하세요:
3.1.1 :content_type
옵션
The :content_type
option is used to specify the content type of the attachment. By default it is auto-detected from the URL, the local file type on disk, or specified content type header in an uploaded file. This option allows you to customize the content type. In this example, downloading an image file from a URL and saving it as a PDF:
:content_type
옵션은 attachment의 content type을 지정하는데 사용됩니다. 기본적으로 URL, 디스크의 로컬 파일 타입, 또는 업로드된 파일의 지정된 content type 헤더에서 자동으로 감지됩니다. 이 옵션을 사용하면 content type을 커스터마이즈할 수 있습니다. 다음 예시는 URL에서 이미지 파일을 다운로드하여 PDF로 저장하는 것입니다:
class User < ApplicationRecord
has_one_attached :avatar do |attachable|
attachable.content_type = "application/pdf"
end
end
user.avatar.attach(io: HTTP.get("https://example.com/avatar.jpg"),
filename: "avatar.jpg")
user.avatar.content_type # => "application/pdf"
You can set content types with validation:
다음과 같이 validation과 함께 content type을 설정할 수 있습니다:
class User < ApplicationRecord
has_one_attached :avatar do |attachable|
attachable.content_type = "application/pdf" if attachable.content_type.include?("image/")
end
end
user.avatar.attach(io: HTTP.get("https://example.com/avatar.jpg"),
filename: "avatar.jpg")
user.avatar.content_type # => "application/pdf"
user.avatar.attach(io: File.open("avatar.pdf"),
filename: "avatar.pdf",
content_type: "application/pdf")
user.avatar.content_type # => "application/pdf"
Notes, Tips and Warnings
------------------------
가끔은 한 문단이 좀 더 주목을 받을만 합니다. 예를 들어 흔한 오해를 명확히 하거나 애플리케이션이 중단될 수 있는 문제에 대해 경고하는 경우입니다.
문단을 강조하려면 `NOTE:`, `TIP:` 또는 `WARNING:`을 앞에 붙이세요:
문단을 강조하기 위해서는 NOTE
, TIP
또는 WARNING
을 사용하세요.
이것은 문단을 특별한 컨테이너로 감싸서 다음과 같은 결과를 만듭니다:
문단을 강조하기 위해 NOTE
, TIP
또는 WARNING
을 사용하세요.
3.2 참고
NOTE
를 사용하여 주제와 맥락에 관련된 중요한 내용을 강조합니다.
이를 읽으면 해당 주제나 맥락을 이해하는 데 도움이 되거나,
중요한 항목을 명확히 할 수 있습니다.
예를 들어, locale 파일을 설명하는 섹션에는 다음과 같은 NOTE
가 있을 수 있습니다:
새로운 locale 파일을 추가할 때는 서버를 재시작해야 합니다.
3.3 TIP
TIP
은 해당 주제에 대한 추가 정보이지만, 이해에 반드시 필요한 것은 아닙니다. 다른 가이드나 웹사이트로 안내할 수 있습니다:
라우팅에 대해 더 자세히 알아보려면, 외부에서 보는 Rails 라우팅을 참조하세요.
또는 더 자세히 알아보기 위한 도움이 되는 명령어를 보여줄 수 있습니다:
generator에 대한 추가 도움말을 보려면, bin/rails generate --help
를 실행하세요.
3.4 WARNING
WARNING
은 애플리케이션을 망가뜨릴 수 있는 피해야 할 사항들에 사용하세요:
callback 메서드 내에서 update
, save
또는 객체에 부작용을 일으키는 다른 메서드들의 사용을 자제하세요.
또는 애플리케이션의 보안을 손상시킬 수 있는 것들에 대해 경고하세요.
master key를 안전하게 보관하세요. master key를 커밋하지 마세요.
4 Links
설명이 포함된 링크를 사용하고 "여기" 및 "더 보기"와 같은 링크는 피하세요:
# BAD
[상세 내용](i18n.html)은 Rails Internationalization (I18n) API 문서를 참고하세요.
# GOOD
더 자세한 내용은 [Rails Internationalization (I18n) API 문서](i18n.html)를 참고하세요.
내부 링크에도 설명이 담긴 링크를 사용하세요:
# BAD
이것은 [아래](#multiple-callback-conditions)에서 다룰 것입니다.
# GOOD
이것은 아래에 있는 [multiple callback conditions 섹션](#multiple-callback-conditions)에서 다룰 것입니다.
4.1 API 연결하기
API(api.rubyonrails.org
)로의 링크는 가이드 생성기에서 다음과 같은 방식으로 처리됩니다:
release tag를 포함하는 링크는 그대로 유지됩니다. 예를 들어:
ActiveRecord::Attributes::ClassMethods
attribute(name, cast_type = nil, **options) ⇒ Object
모델에 attribute를 정의합니다. 이것은 데이터베이스로부터의 데스크립터가 아닙니다. 대신, 모델에 attribute를 추가하거나 기존 attribute의 동작을 덮어쓸 때 사용됩니다.
class User < ActiveRecord::Base
attribute :password, :string
end
위의 예시 코드는 User
객체에 password attribute를 추가합니다. attribute의 데이터 타입은 두 번째 파라미터에 의해 결정됩니다. 지원되는 타입은 아래와 같습니다:
- :big_integer
- :binary
- :boolean
- :date
- :datetime
- :decimal
- :float
- :integer
- :string
- :text
- :time
attribute를 명시적으로 선언하면, 해당 attribute가 데이터베이스에 있는지 여부와 관계없이 객체에서 사용할 수 있습니다.
세 번째 옵션 파라미터를 통해 기본값을 지정할 수 있습니다:
class StoreProduct < ActiveRecord::Base
attribute :status, :string, default: 'draft'
store_accessor :status_info, :status
end
default
옵션으로는 값이나 람다를 넘길 수 있습니다:
class UnsubscribeToken < ActiveRecord::Base
attribute :expired_at, :datetime, default: -> { Time.current + 1.day }
end
자신만의 타입을 만드는 것도 가능합니다. ActiveRecord::Type::Value
을 상속하여 타입을 정의하고, 이를 등록하여 사용할 수 있습니다.
# app/types/money_type.rb
class MoneyType < ActiveRecord::Type::Integer
def cast(value)
if !value.kind_of?(Numeric) && value.include?('$')
price_in_dollars = value.gsub(/\$/, '').to_f
super(price_in_dollars * 100)
else
super
end
end
end
# config/initializers/types.rb
ActiveRecord::Type.register(:money, MoneyType)
# app/models/store_listing.rb
class StoreListing < ActiveRecord::Base
attribute :price_in_cents, :money
end
store_listing = StoreListing.new(price_in_cents: '$10.00')
store_listing.price_in_cents # => 1000
ActiveRecord::Type::Value
를 상속한 클래스는 다음과 같은 메소드를 오버라이드할 수 있습니다:
cast
- 입력값을 적절한 루비 타입으로 변환serialize
- 데이터베이스에 저장하기 위해 값을 직렬화deserialize
-serialize
의 반대
수정되지 않습니다.
릴리스 노트에서는 이를 사용해주세요. 생성되는 대상과 관계없이 해당하는 버전을 가리켜야 하기 때문입니다.
링크에 릴리스 태그가 포함되어 있지 않고 edge guides가 생성되는 경우, 도메인은 edgeapi.rubyonrails.org
로 대체됩니다. 예를 들어,
ActionDispatch::Response
Response 객체는 controller action이나 middleware에 의해 생성되는 모든 HTTP 응답을 나타냅니다. Response 객체는 응답 헤더를 설정하고 body를 제공하는데 사용됩니다.
5 Status, header, body
HTTP Response는 세 가지 필수 요소로 구성됩니다:
- Status
- Header
- Body
5.1 Status
사용 가능한 HTTP 상태 코드는 Status codes 정의에서 찾을 수 있습니다. Response 객체는 상태 코드의 숫자 값을 설정하는 것을 허용하지만, 이는 해당하는 HTTP 상태 메시지로 변환됩니다. 예를 들어:
response.status = 200 # => "200 OK"
response.status = 404 # => "404 Not Found"
5.2 Header
response.headers
는 response의 헤더 값을 저장합니다. 헤더 이름은 대문자와 밑줄로 정규화되며, 중복된 헤더 항목은 병합됩니다(RFC2616에 따라). 문자열이 아닌 헤더 값은 문자열로 변환됩니다.
response.headers["PAGE_TITLE"] = "Index"
5.3 Body
Response body는 문자열 또는 문자열을 생성할 수 있는 객체여야 합니다. 기본적으로 body는 빈 문자열입니다.
6 Cookie와 Session
Cookie와 Session은 사용자의 현재 세션과 관련된 정보를 유지하는 데 사용됩니다. Cookie 데이터는 클라이언트 측에 저장되는 반면, Session 데이터는 서버 측에 유지됩니다.
6.1 Setting Cookie
Cookie를 설정하려면 cookies
메서드를 사용합니다:
cookies[:user_id] = "5"
6.2 Session Management
Session 데이터는 다음과 같이 관리될 수 있습니다:
session[:user_id] = "5"
7 렌더링과 리디렉션
7.1 Rendering Content
다양한 방법으로 콘텐츠를 렌더링할 수 있습니다:
render :xml => @post
render :json => @post
render :plain => "OK"
7.2 Redirects
리디렉션은 다음과 같이 수행됩니다:
redirect_to :action => "show"
redirect_to post_url(@post)
8 Content Type
Response의 Content-Type은 다음과 같이 설정할 수 있습니다:
response.content_type = "text/html"
9 Streaming
Response는 데이터를 스트리밍하는 것을 지원합니다:
self.response_body = @article.to_xml
Rails는 자동으로 올바른 Content-Length 헤더를 설정합니다.
becomes를 사용하면 매핑된 두 모델을 서로 전환할 수 있습니다.
이를 사용하기 위해선 mappings.rb와 같은 파일에 매핑을 먼저 구성해야 합니다:
class Bulb < ActiveRecord::Base
def self.inheritance_column
nil
end
belongs_to :hue
has_many :locations
has_many :serial_numbers
mappings do
map_to Lamp do
attributes :type, :color, :brightness, :power, :serial
end
end
end
class Lamp < ActiveRecord::Base
def self.inheritance_column
nil
end
belongs_to :shade
has_many :serial_numbers
has_many :rooms
mappings do
map_to Bulb do
attributes :type, :color, :brightness, :power, :serial
end
end
end
그런 다음 래핑된 모델간 변환을 수행할 수 있습니다:
bulb = Bulb.create!(serial: "0x000001", type: "LED", color: 'orange')
lamp = bulb.becomes(Lamp)
lamp.serial # => "0x000001"
ActionDispatch::Response
ActionDispatch::Response
객체는 웹 서버에 대한 응답을 캡슐화합니다. 기본적으로 Response 객체에는 3가지 속성이 있습니다:
- header -
Headers
객체로 응답 HTTP header를 포함합니다 - body - 응답 본문을 포함합니다.
HTML
템플릿의 내용이 기본값입니다 - status - HTTP 상태 코드 (예: "200 OK", "404 Not Found")
10 예제
10.1 응답 상태 설정:
response.status = 404
10.2 응답 header 설정:
response.headers["Content-Type"] = "application/json"
10.3 Response 본문 설정:
response.body = "Hello World!"
10.4 Response 본문 추가:
response.body << " From Rails!"
10.5 Response가 이미 보내졌는지 확인:
response.committed?
10.6 Response 헤더에서 Set-Cookie 읽기:
response.get_header("Set-Cookie")
10.7 컨텐츠 타입이 특정 MIME 타입과 일치하는지 확인:
response.media_type
10.8 전체 content-type header 가져오기:
response.content_type
10.9 Cookie 추가:
response.set_cookie(cookie_name, cookie_options)
10.10 Cookie 삭제:
response.delete_cookie("cookie_name")
만약 link가 release tag를 포함하지 않고 release guides가 생성되고 있다면, Rails 버전이 주입됩니다. 예를 들어, v5.1.0 버전의 가이드를 생성하는 경우 link는
ActionDispatch::Response
본 클래스는 Rack::Response에 래핑되어 있으며 Rails 응답 처리를 위한 전체 인터페이스를 제공합니다.
11 응답 헤더 설정하기
응답 headerx를 설정하려면 헤더 accessor를 사용합니다:
response.headers["Cache-Control"] = "no-cache"
12 응답 Cookies 설정하기
응답 cookies를 설정하려면:
response.set_cookie("user_name", value: "david", path: "/")
삭제하려면:
response.delete_cookie("user_name", path: "/")
13 Content-Type 설정하기
응답 content type을 설정하려면:
response.content_type = "text/plain"
14 Status Code 설정하기
응답 status code를 설정하려면:
response.status = 404
15 응답 Body 설정하기
응답 body를 설정하려면:
response.body = "Hello"
becomes
이것은 내부적으로 to_model
을 호출함으로써 객체를 다른 모델로 변환합니다. 이것은 ActionController::Parameters
를 실제 모델로 변환할 때 유용합니다:
class Article
def permitted_params(params)
params.require(:article).permit(:name)
end
end
params = ActionController::Parameters.new(article: { name: "Brave New World" })
article = Article.find(1)
article.permitted_params(params).becomes(Article)
ActionDispatch::Response
ActionDispatch::Response
객체는 client에게 데이터를 돌려보내는 response를 나타냅니다. ActionDispatch::Response
객체는 response의 header와 body를 포함합니다.
16 메서드들:
16.1 #initialize(status = 200, header = {}, body = [])
response 객체를 초기화합니다.
status
- HTTP status code (기본값: 200)header
- response header로 사용될 hashbody
- response body로 사용될 string array
16.2 #status=
response의 HTTP status code를 설정합니다.
16.3 #headers
response의 header를 반환합니다.
16.4 #header
response의 header를 반환합니다. (headers
의 alias)
16.5 #body
response의 body를 반환합니다.
16.6 #body=
response의 body를 설정합니다.
16.7 #location
Location header를 반환합니다.
16.8 #location=
Location header를 설정합니다.
16.9 #status
response의 HTTP status code를 반환합니다.
16.10 #success?
status code가 성공을 나타내는지 확인합니다 (200-299).
16.11 #redirect?
response가 redirect인지 확인합니다 (300-399).
16.12 #client_error?
client error인지 확인합니다 (400-499).
16.13 #server_error?
server error인지 확인합니다 (500-599).
16.14 #not_found?
404 status code인지 확인합니다.
16.15 #content_type
Content-Type header를 반환합니다.
16.16 #media_type
Content-Type header에서 MIME type 부분을 반환합니다.
16.17 #charset
Content-Type header에서 charset을 반환합니다.
16.18 #charset=
Content-Type header에서 charset을 설정합니다.
16.19 #content_type=
Content-Type header를 설정합니다.
16.20 #response_code
HTTP status code를 반환합니다.
16.21 #cache_control
Cache-Control header를 반환합니다.
16.22 #etag
ETag header를 반환합니다.
16.23 #etag=
ETag header를 설정합니다.
16.24 #last_modified
Last-Modified header를 반환합니다.
16.25 #last_modified=
Last-Modified header를 설정합니다.
16.26 #to_a
response를 [status, header, body] array로 변환합니다.
edgeapi.rubyonrails.org
에 수동으로 링크하지 마세요.
17 Column Wrapping
오래된 가이드의 컬럼을 재포맷하지 마세요. 하지만 새로운 섹션과 가이드는 80컬럼에서 줄바꿈을 해야 합니다.
18 API Documentation Guidelines
가이드와 API는 적절한 경우 일관성있고 통일성이 있어야 합니다. 특히 API Documentation Guidelines의 다음 섹션들은 가이드에도 적용됩니다:
19 HTML Guides
가이드를 생성하기 전에, 시스템에 최신 버전의 Bundler가 설치되어 있는지 확인하세요. 최신 버전의 Bundler를 설치하려면 gem install bundler
를 실행하세요.
이미 Bundler가 설치되어 있다면 gem update bundler
로 업데이트할 수 있습니다.
19.1 생성하기
모든 가이드를 생성하려면 guides
디렉토리로 cd
명령으로 이동한 후, bundle install
을 실행하고 다음을 실행하세요:
$ bundle exec rake guides:generate
다음의 'or' 문자만 있어서 해당 텍스트를 한국어로 번역하면:
또는
$ bundle exec rake guides:generate:html
생성된 HTML 파일은 ./output
디렉토리에서 찾을 수 있습니다.
my_guide.md
만 처리하려면 ONLY
환경변수를 사용하세요:
$ touch my_guide.md
$ bundle exec rake guides:generate ONLY=my_guide
기본적으로 수정되지 않은 가이드는 처리되지 않기 때문에 실제로는 ONLY
가 거의 필요하지 않습니다.
모든 가이드를 강제로 처리하려면 ALL=1
을 전달하세요.
영어 이외의 언어로 가이드를 생성하려면 source
아래의 별도 디렉토리(예: source/es
)에 보관하고 GUIDES_LANGUAGE
환경 변수를 사용할 수 있습니다:
$ bundle exec rake guides:generate GUIDES_LANGUAGE=es
생성 스크립트를 설정하기 위해 사용할 수 있는 모든 환경 변수를 보려면 다음을 실행하세요:
$ rake
19.2 Validation
생성된 HTML을 다음으로 검증해주세요:
$ bundle exec rake guides:validate
특히, 제목은 내용으로부터 ID가 생성되기 때문에 종종 중복이 발생합니다.
20 Kindle Guides
20.1 Generation
Kindle용 가이드를 생성하려면 다음 rake task를 사용하세요:
$ bundle exec rake guides:generate:kindle