嵌套表单/控制器

时间:2014-08-21 22:29:44

标签: ruby-on-rails

我已经选择了许多类似的问题/答案,但我只是没有得到我做错了什么 - 非常感谢任何帮助。

我正在尝试创建一个嵌套表单,这样当我添加一个新成员时,我可以从我可用的机构中选择他们成为其成员。

我有这两个模型(我知道他们缺乏验证)

class Institution < ActiveRecord::Base
  has_many :members
  accepts_nested_attributes_for :members
end

class Member < ActiveRecord::Base
  belongs_to :institution
  belongs_to :user
  accepts_nested_attributes_for :institution
end

这是控制器:

class MembersController < ApplicationController
  before_action :set_member, only: [:show, :edit, :update, :destroy]

  def index
    @members = current_user.members
  end

  def show
    @member = current_user.members.find(params[:id])
  end

  def new
    @members = current_user.members
    @institutions = @members.institution
    @member = Member.new
  end

new def中,我使用@members = current_user.members因为它似乎在index def中正常工作。但是作业@institutions = @members.institution不起作用 - 我收到了这个错误:

undefined method `institution' for # Member::ActiveRecord_Associations_CollectionProxy:0x000000028ce4f0>

如果我查看数据库,我看到成员确实有有效的institution_id

2 个答案:

答案 0 :(得分:0)

问题是你正在尝试为记录集合调用机构方法,我不确定我提议的解决方案是否是你想要做的,但是你只能在一个成员记录上调用机构方法......

@institutions = []  #initializing array
@members.each do |member|
   @institutions << member.institution
end

现在@institutions填充了来自成员的一系列机构记录

答案 1 :(得分:0)

<强>集合

您的错误是由于您致电@members.institution而造成的 - 您无法在集合上致电institution - 仅限于此可用于单个对象(IE,如果您调用@member.institution

您想要做的事情可能是collection_select允许member加入一系列不同的institutions

#app/controllers/members_controller.rb
Class MembersController < ApplicationController
   def new
      @members = current_user.members
      @member = Member.new
   end

   def create
      @member = Member.new(member_params)
      @member.save
   end

   private

   def member_params
      params.require(:member).permit(:institution_ids, :other, :member, :attributes)
   end
end

#app/views/members/new.html.erb
<%= form_for @member do |f| %>
   <%= f.collection_select :institution_ids, Institution.all, :id, :name %>
   <%= f.submit %>
<% end %>