まずuserモデルに関連付けるpostモデルを作成する
$ rails g model Post content:text user:references
referencesオプションはモデルと関連付けるときに使うやつで、関連付けたいモデルを指定することで(今回はuserが指定してある)勝手にpostモデルに外部キー(user_id)のカラムを作成してくれる。
このジェネレートの時に
user_id:referencesとしてしまうと、postカラムuser_id_idが追加されてしまうから注意。
userと指定するだけでuser_idとrailsが勝手に判断してくれる。
userモデルにhas_manyを追加
もうpostモデルにはbelongs_to userが勝手に指定されているのでuserモデルのみにこれを加える
has_many :posts
これで、userとpostが関連づいた。
postのルーティングを設定
resources :users
resources :posts, :only => [:create, :destroy]
postはcreateとdestroyしか使わないからonlyオプションで限定する。
postコントローラーを作成
$ rails g controller posts
postコントローラーにcreateメソッドを作成
def create
@post = current_user.posts.build(post_params)
if @post.save
redirect_to current_user
else
render root_path
end
end
buildを使うとどのuserがpostしたかを勝手に関連付けてくれる。
form_forの作成
私はユーザー詳細ページであるusers/show.html.erbでformを作った。
<%= form_for(@post) do |f| %>
<%= f.label :content, "ひとこと" %>
<%= f.text_area :content %>
<%= f.submit "つぶやく"%>
<% end %>
これでもエラーが出る。
それはこのshowページがuserのshowアクションだから。
なのでusers_controller.rbのshowアクションにも追加をする。
def show
@user = User.find(params[:id])
@post = current_user.posts.build if logged_in?
end
formのすぐ下に表示
<% @user.posts.each do |p| %>
<p>
<%= p.content %>
</p>
<% end %>
あとはcssで自分の好きなデザインにしておしまい。