1

ユーザーが他の人のマイクロポストにコメントできるユーザー/マイクロポスト/コメントモデルがあります。すべての投稿の下にテキストフィールドが表示されるので、ユーザーはコメントを入力できますが、マイクロポストIDを見つけるのに苦労しています。問題は私のform_forコメントまたはコントローラーにあると思いますが、よくわかりません。いくつかの助けが大好きです、ありがとう。

エラー:IDのないマイクロポストが見つかりませんでした

モデル:

User Model: has many microposts, has many comments
Micropost Model: belongs to user, has many comments
Comment Model: belongs to micropost, belongs to user

ユーザーコントローラー:

def show #(the profile page where all the posts and comments are)
  @user = User.find(params[:id])
  @microposts = @user.microposts.paginate(page: params[:page])
  @micropost  = current_user.microposts.build if signed_in?
  @comments = @micropost.comments
  @comment = current_user.comments.build(:micropost => @micropost) if signed_in?
end

コメントコントローラー:

def create
  @micropost = Micropost.find(params[:id])
  @comment = current_user.comments.build(:micropost => @micropost) #can someone explain what happens in the parentheses? 
  @comment.user = current_user
  @comment.save
  redirect_to :back
end

表示/コメント/_comment_form:

<%= form_for(@comment) do |f| %>
  <div id="comment_field">
    <%= f.text_field :content, placeholder: "Say Something..." %>
  </div>
<% end %>

ルート:

resources :users
resources :microposts, only: [:create, :destroy]
resources :comments, only: [:create, :destroy]
4

2 に答える 2

3

micropost_idの非表示フィールドを追加するだけです

<%= form_for(@comment) do |f| %>
  <%= f.hidden_field :micropost_id, value: @micropost.id %>
  <div id="comment_field">
    <%= f.text_field :content, placeholder: "Say Something..." %>
  </div>
<% end %>

更新:micropost_idコントローラーに変更を加えずに渡す

コメントコントローラーに基づいて、フォームを送信したときにどちらが欠落しているかにmicropost基づいて検索します。params[:id]以下のコードはそれを修正します。ただし、コントローラーコードをより美しく、より洗練されたものにするネストされたリソースを確認することをお勧めします

<%= form_for @comment do |f| %>
  <%= hidden_field_tag :id, @micropost.id %>
  <div id="comment_field">
    <%= f.text_field :content, placeholder: "Say Something..." %>
  </div>
<% end %>

actionまたはフォームのを更新します

<%= form_for @comment, url: comments_path(id: @micropost.id) do |f| %>
  <div id="comment_field">
    <%= f.text_field :content, placeholder: "Say Something..." %>
  </div>
<% end %>

更新:コメントコントローラーを編集

# view
<%= form_for @comment do |f| %>
  <%= hidden_field_tag :micropost_id, @micropost.id %>
  <div id="comment_field">
    <%= f.text_field :content, placeholder: "Say Something..." %>
  </div>
<% end %>

# comments_controller.rb

def create
  @micropost = Micropost.find params[:micropost_id]
  @comment = current_user.comments.build
  @comment.micropost = @micropost
  @comment.save
end
于 2013-02-05T12:56:29.867 に答える
1

コメントリソースは次のように設定する必要があります。

resources :users
resources :microposts, only: [:create, :destroy] do
  resources :comments, only: [:create, :destroy]
end

上記のリソースはネストされたリソースと呼ばれます。また、あなたの場合と同様に、コメントは常にマイクロポストに関連しているため、コメントリソースをマイクロポスト とコメントコントローラーにネストする必要があります。

def create
  @micropost = Micropost.find(params[:id])
  @comment = current_user.comments.build(:micropost => @micropost) #can someone explain what happens in the parentheses?
  @comment.save
  redirect_to :back
end

上記のbuildメソッドは、コメントモデルの新しいオブジェクト/インスタンスを作成します。これを使用current_user.commentsしたので、オブジェクトはuser_id = current_user.id自動的に作成され、再度指定する必要はありません。そして、'build(:micropost => @micropost)'はオブジェクトにを追加micropost's id@commentます。

于 2013-02-05T13:08:06.143 に答える