LoginSignup
18
17

More than 5 years have passed since last update.

Rails4で実戦的なブログを作成(その2)

Posted at

記事(Post)を作成する

次に記事(Post)を作成します。

$ rails g scaffold Post title:string body:text
$ rake db:migrate

ここでは、見出し(title)と本文(body)を持つように定義しておきます。

見出しと本文の入力を必須にする

見出しまたは本文が未設定の状態でポストできることは望ましくないため、必須項目に設定します。項目が空でないことを検証すればよいので、validates_presence_of宣言を使います。

app/models/post.rb
class Post < ActiveRecord::Base
  validates_presence_of :title
  validates_presence_of :body
end

記事にブログへのリレーションを追加する

記事がいずれか1つのブログに属するようにリレーションを追加します。

記事へのブログIDの追加

記事にブログIDを追加します。

記事にブログIDを追加するマイグレーションスクリプトを生成します。

$ rails g migration AddBlogIdToPosts

生成されたマイグレーションスクリプトを以下のように編集します。

db/migrate/YYYYMMDDHHMMSS_add_blog_id_to_posts.rb
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側は単数形で書きます。

app/models/post.rb
class Post < ActiveRecord::Base
  validates_presence_of :title
  validates_presence_of :body
  belongs_to :blog
end

一方、ブログから記事へのリレーションは1対nの関係なので、has_many宣言を書きます。この時、指定するn側は複数形で書きます。

app/models/blog.rb
class Blog < ActiveRecord::Base
  validates_presence_of :name
  has_many :posts
end

記事投稿時にブログを選択できるようにする

_form.html.erbに以下を追加して、ブログを指定できるようにします。

views/posts/_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.rbpost_paramsメソッドを次のように書き換えます。

app/controllers/posts_controller.rb
    def post_params
      params.require(:post).permit(:title, :body, :blog_id)
    end

これで、ブログを指定できるようになり、それがDBにも反映されるようになります。

記事を投稿する

サーバを起動し、記事が投稿できることを確認します。

18
17
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
18
17