目前,我在项目模型和邀请模型之间有一个has_many和belongs_to关联。我在项目控制器的show动作中有一个form_form邀请。
项目/ show.html.erb
<div class="center">
<h1><%= @project.title %></h1>
<%= form_for @invitation do |f| %>
<%= f.collection_select :user_id, User.all, :id, :first_name %><br>
<%= f.submit "Send Invitation", class: "btn btn-primary" %>
<% end %>
</div>
选择目标用户并提交表单会将当前用户带到“&#39; new&#39;邀请页面,并且已为新邀请保存user_id。但是,我还需要一个project_id来保存,我无法弄清楚如何做到这一点。我试图看看我是否可以在&#39;创建&#39;中定义一个实例变量@project。 invitations_controller的动作,但我无法知道如何。
invitations_controller.rb
class InvitationsController < ApplicationController
def new
@invitation = Invitation.new
end
def create
@invitation = @project.create_invitation(invitation_params)
if @invitation.save
flash[:success] = "Invitation sent!"
redirect_to @invitation
else
render 'new'
end
end
def show
@invitation = Invitation.find(params[:id])
end
private
def invitation_params
params.require(:invitation).permit(:user_id, :project_id, :description)
end
end
请帮帮我。谢谢!
答案 0 :(得分:3)
与invitations
project
# view
...
<%= form_for @project.invitations.build do |f| %>
<%= f.collection_select :user_id, User.all, :id, :first_name %><br>
<%= f.submit "Send Invitation", class: "btn btn-primary" %>
<% end %>
# controller
def create
@invitation = Invitation.new(invitation_params)
if @invitation.save
flash[:success] = "Invitation sent!"
redirect_to @invitation
else
render 'new'
end
end
答案 1 :(得分:1)
最简单的方法是将id添加为隐藏字段。你的强大的params应该照顾project_id它看起来像:
<%= form_for @invitation do |f| %>
<%= f.hidden_field :project_id, @project.id %>
<%= f.collection_select :user_id, User.all, :id, :first_name %><br>
<%= f.submit "Send Invitation", class: "btn btn-primary" %>
<% end %>
然后在您的控制器中,只需使用参数创建一个新的。通过新方法传递id将为您关联记录。
def create
@invitation = Invitation.new invitation_params
if @invitation.save
flash[:success] = "Invitation sent!"
redirect_to @invitation
else
render 'new'
end
end
另请注意,当您调用实际调用create方法的create_invitation
时。所以它已经保存了。与new
相对应的build_invitation(invitation_params)
只是{{1}}
答案 2 :(得分:0)
如果您询问如何在Project
表单中包含父Invitation
模型,可以将它们放在这样的数组中:
<%= form_for [@project, @invitation] do |f| %>
....
<% end %>