Help us understand the problem. What is going on with this article?

has_manyとbelongs_toについて。モデルの関連付けされたformの作り方

More than 3 years have passed since last update.

まず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モデルのみにこれを加える

user.rb
has_many :posts

これで、userとpostが関連づいた。

postのルーティングを設定

routes.rb
  resources :users 
  resources :posts, :only => [:create, :destroy]

postはcreateとdestroyしか使わないからonlyオプションで限定する。

postコントローラーを作成

$ rails g controller posts

postコントローラーにcreateメソッドを作成

posts_controller.rb
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を作った。

show.html.erb
<%= form_for(@post) do |f| %>

  <%= f.label :content, "ひとこと" %>
  <%= f.text_area :content %>
  <%= f.submit "つぶやく"%>
<% end %>


これでもエラーが出る。
それはこのshowページがuserのshowアクションだから。
なのでusers_controller.rbのshowアクションにも追加をする。

users_controller.rb
def show
    @user = User.find(params[:id])
    @post = current_user.posts.build if logged_in?
  end


formのすぐ下に表示

show.html.erb
<% @user.posts.each do |p| %>
  <p>
    <%= p.content %>
  </p>
<% end %>

あとはcssで自分の好きなデザインにしておしまい。

Kaisyou
オーストラリアで修行中
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした