記事(Post)を作成する
次に記事(Post)を作成します。
$ rails g scaffold Post title:string body:text
$ rake db:migrate
ここでは、見出し(title)と本文(body)を持つように定義しておきます。
見出しと本文の入力を必須にする
見出しまたは本文が未設定の状態でポストできることは望ましくないため、必須項目に設定します。項目が空でないことを検証すればよいので、validates_presence_of
宣言を使います。
class Post < ActiveRecord::Base
validates_presence_of :title
validates_presence_of :body
end
記事にブログへのリレーションを追加する
記事がいずれか1つのブログに属するようにリレーションを追加します。
記事へのブログIDの追加
記事にブログIDを追加します。
記事にブログIDを追加するマイグレーションスクリプトを生成します。
$ rails g migration AddBlogIdToPosts
生成されたマイグレーションスクリプトを以下のように編集します。
class AddBlogIdToPosts < ActiveRecord::Migration
def self.up
add_column(:posts, :blog_id, :integer)
add_index(:posts, :blog_id)
end
def self.down
remove_index(:posts, :column => :blog_id)
remove_column(:posts, :blog_id)
end
end
マイグレーションを実行します。
$ rake db:migrate
記事からブログへのリレーションの追加
記事からブログへのリレーションはn対1の関係なので、belongs_to
宣言を書きます。この時、指定する1側は単数形で書きます。
class Post < ActiveRecord::Base
validates_presence_of :title
validates_presence_of :body
belongs_to :blog
end
一方、ブログから記事へのリレーションは1対nの関係なので、has_many
宣言を書きます。この時、指定するn側は複数形で書きます。
class Blog < ActiveRecord::Base
validates_presence_of :name
has_many :posts
end
記事投稿時にブログを選択できるようにする
_form.html.erbに以下を追加して、ブログを指定できるようにします。
<div class="field">
<%= f.label :blog_id %><br />
<%= f.collection_select :blog_id, Blog.all, :id, :name %>
</div>
<% end %>
ただ、このままではblog_id
は許可されていないパラメータとして弾かれてしまうため、posts_controller.rb
のpost_params
メソッドを次のように書き換えます。
def post_params
params.require(:post).permit(:title, :body, :blog_id)
end
これで、ブログを指定できるようになり、それがDBにも反映されるようになります。
記事を投稿する
サーバを起動し、記事が投稿できることを確認します。