Ruby on Rails:从不同的控制器中查找模型实例

时间:2014-08-02 20:50:16

标签: ruby-on-rails has-many model-associations belongs-to

目前,我在项目模型和邀请模型之间有一个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

请帮帮我。谢谢!

3 个答案:

答案 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 %>