form_forから別のコントローラにパラメータを渡すにはどうすればよいですか?

私はIssueモデルとCommentモデルを持っています。 issue#show viewにはコメントフォームがあります。私はissue#show controllerアクションでフォームの@commentを作成し、それをコメント#create controllerアクションに渡して、実際にdbにコメントを作成して保存します。しかし、@commentパラメータがcomment#createアクションに渡されると、私は必要なissue_id情報を持っていません。どのように私はその情報を渡すだろうか?ここに私のファイルがあります:

<%= form_for @comment do |f| %>
    <%= render 'comment_fields', :f => f %>
    <%= f.submit "Submit" %>
<% end %>

コントローラを発行する:

  def show
     @issue = Issue.find(params[:id])
     @votes = Votership.where(:issue_id => @issue.id)
     @current_user_vote = @votes.where(:user_id => current_user.id).first
     @comment = Comment.new
  end

コメントコントローラ:

  def create
    @comment = Comment.new(params[:comment])
    @comment.save
    redirect_to :back
  end
1

2 答え

show アクションで @comment を作成する方法を変更するだけです

def show
  @issue = Issue.find(params[:id])
  @votes = Votership.where(:issue_id => @issue.id)
  @current_user_vote = @votes.where(:user_id => current_user.id).first
  @comment = @issue.comments.build # assigns issue_id to comment
end

これで、 @comment のフォームをレンダリングするときに、 issue_id が隠れたフォーム入力に存在するはずです


This is unrelated to your question, but I'm also noticing the way you're loading @current_user_vote

@current_user_vote = @votes.where(:user_id => current_user.id).first

おそらくこれを次のように行うべきです:

@current_user_vote = current_user.votes.first
0
追加された
#show viewのissueに対するコメントを作成することでこのようなことを試しました。これには必要な変数が含まれていました。しかし、Comment.new(params [:comment])を実行したときにコメント#createアクションに渡されたときに、その変数が削除されました(新しいコメントが作成され、そのvarがparams [ :コメント])。あなたのコードを試したとき、build_commentは私にエラーを出しました:未定義のメソッド `build_comment '
追加された 著者 Matthew Berman,
バージョン3.1 ...私が必要とするのはissue_idをコメントコントローラに渡す方法です。 <%= hidden_​​field(:issue_id、@ issue.id)%>しかし、私はこれを実装しているとは思えません。なぜなら、aを渡しているのはissue_idと呼ばれています。 key = @ issue.idとvalue = nil。
追加された 著者 Matthew Berman,
どのバージョンのRailsをお使いですか?私は自分の答えを更新しました。
追加された 著者 maček,

私がよく理解すれば、問題には多くのコメントがあり、コメントには問題があります。

# config/routes.rb
# Nest the comment under the issue
resources :issues do
  resources :comments, only[:create]
end

# app/models/issue.rb
has_many :comments

# app/models/comment.rb
belongs_to :issue

# app/controllers/issues_controller.rb
def show
  @issue = Issue.find params[:id]
  ...
end

# app/views/issues/show.html.erb
<%= form_for [@issue, @issue.comments.build] do |f| %>
....
<% end %>

# app/controllers/comments_controller.rb
def create
  @issue = Issue.find params[:issue_id]
  @comment = @issue.comments.build params[:comment]
  if @comment.save
    redirect_to @issue
  else
    render 'issues/show' # => it will know which issue you are talking about, don't worry
  end
end

# or if you don't need validation on comment:
def create
  @issue = Issue.find params[:issue_id]
  @issue.comments.create params[:comment]
  redirect_to @issue
end

問題#ちょっと奇妙に見える。

def show
  @issue = Issue.find params[:id]
  @votes = @issue.voterships
  @current_user_vote = current_user.votes.first
  # maybe you want to list all the comments: @comments = @issue.comments
end
0
追加された
はい、私はコメントのためのリソースを持っていません...それは必要ではありません。これはうまくいかない
追加された 著者 Matthew Berman,
私はそのためのリソースを追加しました。ただし、コメントはアプリに属する​​問題に属します。したがって、ネストされた二重のリソースがあります。その場合、どうすればいいのですか?
追加された 著者 Matthew Berman,
しかし、私はあなたがapp/issue/commentが必要であることを知っていることを示唆したコードの残りの部分をどのように使用しますか
追加された 著者 Matthew Berman,