【问题标题】:Unknown attribute error with nested form - Rails 3.2嵌套形式的未知属性错误 - Rails 3.2
【发布时间】:2012-11-18 00:50:39
【问题描述】:

我有一个活动模型和一个场地模型。每个活动有1个场地。但是一个场地可以有多个活动。作为活动创建过程的一部分,我还想捕获有关场地的信息并将其存储。现在我正在为嵌套表单设置而苦苦挣扎。我收到以下错误:

ActiveRecord::UnknownAttributeError in EventsController#new
unknown attribute: event_id

事件模型

class Event < ActiveRecord::Base
attr_accessible :name, :budget, :user_id, :venue_id, :client, :date, :description, 
:attendees, :assets_attributes, :tag_list, :venue_attributes
belongs_to :user

has_many :assets, :dependent => :destroy
has_many :vendors
has_one :venue

accepts_nested_attributes_for :assets, :allow_destroy => true
accepts_nested_attributes_for :vendors, :allow_destroy => true
accepts_nested_attributes_for :venue, :allow_destroy => true
acts_as_taggable
end

场地模型

class Venue < ActiveRecord::Base
attr_accessible :capacity, :city, :contact, :country, :email, :exclusiveVendors,:fee, 
:latitude, :longitude, :name, :state, :street, :tel, :union
belongs_to :event
has_many :vendors
acts_as_gmappable
has_many :events
end

事件控制器

def new
  @event = Event.new
  5.times { @event.assets.build }
  venue = @event.build_venue()
  # respond_to do |format|
  #   format.html # new.html.erb
  #   format.xml  { render :xml => @event }
  # end

end

def create
  @user = current_user
  @event = Event.new(params[:event])
  @event.create_venue()

  5.times { @event.build_assets}
  if @event.save
    redirect_to @event, :notice => "Successfully created event."
  else
    render :action => 'new'
  end
end

表格(摘录)

<%= f.fields_for :venue do |builder| %>

    <%= builder.label :name %><br />
    <%= builder.text_field :name %>

<% end %>

【问题讨论】:

    标签: ruby ruby-on-rails-3.2 nested-attributes


    【解决方案1】:

    我认为你在这里弄错了关系。 Venue 模型应该有 has_many :events 和 Event 模型应该有 belongs_to :venue 和一个名为venue_id 的字段。

    并从 Event 模型中删除 has_one :venue 和从 Venue 模型中删除 belongs_to :event。

    【讨论】:

    • 插入了一条空白记录,但场地名称字段没有填充到场地表中,有什么想法吗?我需要将任何东西传递给 @event.create_venue() 吗?
    • 您需要在创建表单时传递事件对象。 form_for(@event) 做 |f| f.fields_for(:venue) 做 |ff| # 这里的场地字段。结束结束
    • 并从控制器中删除 build_venue() 和 create_venue() 方法。使用嵌套属性时不需要这些。
    • 如果我摆脱了 build_venue() 那么场地字段不会出现在表单中。删除 create_venue() 确实解决了这个问题。非常感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多