0

我是一个新手,已经搜索了很多帖子和 railscast 教程,但仍然无法解决这个关联问题。

我有 2 个模型,一个酒店(由脚手架创建)和设施。

关键是将设施与酒店相关联,但由于我的设施表包含它需要的所有布尔类型的列),因此该表中的一行可以用于一家酒店。

问题是,我无法显示和保存/编辑/更新设施。在创建模型设施时,我创建了一个 hotel_id 列。我的代码是:

楷模:

class Facility < ActiveRecord::Base

  belongs_to :hotel

  attr_accessible :concierge, :hotel_id, :room24h

end


class Hotel < ActiveRecord::Base

  has_one :facility, :dependent => :destroy


  accepts_nested_attributes_for :facility, :allow_destroy => true

  attr_accessible :name, :rating, :recommended, :facility_attributes

end

我在视图中的形式是:


<%= form_for(@hotel) do |f| %>

  <div class="field">
    <%= f.label :name %><br />
    <%= f.text_field :name %>
  </div>

  <div class="field">
    <%= f.label :rating %><br />
    <%= f.number_field :rating %>
  </div>

  <div class="field">
    <%= f.label :recommended %><br />
    <%= f.check_box :recommended %>
  </div>

  <br />
    Hotel Facilities

    <%= f.fields_for :facility do |facility_fields| %>
 <div class="field">
    <%= facility_fields.label :room24h, "24h Room Service:" %>
    <%= facility_fields.check_box :room24h %>
  </div>

 <div class="field">
    <%= facility_fields.label "Concierge:" %>
    <%= facility_fields.check_box :concierge %>
  </div>

<%end%>

  <div class="actions">
    <%= f.submit %>
  </div>
<%end%>

至于控制器,hotels_controller 就像你刚刚搭好脚手架,而我的 facility_controller 是空的一样。

它现在在表单中显示设施,但是当我单击“创建”并提交时,我得到:

"Can't mass-assign protected attributes: @hotel"

app/controllers/hotels_controller.rb:46:in `new'
app/controllers/hotels_controller.rb:46:in `create'

至于参数输入:

{"hotel"=>{"rating"=>"1",
 "name"=>"aaa",
 "recommended"=>"0",
 "@hotel"=>{"room24h"=>"1",
 "concierge"=>"1"}},
 "commit"=>"Create Hotel",
 "utf8"=>"✓",
 "authenticity_token"=>"YU7KEJ8qz0iQcXPGkLP6BSJn7JL6df1HvuS5JnjK2eU="}

有任何想法吗?控制器中缺少什么?再次提前感谢

4

2 回答 2

0

在新建/编辑操作中创建@hotel.facility || @hotel.build_facility

于 2012-04-14T15:20:36.567 回答
0

问题解决了。对于有相同问题的任何人:添加到新控制器中:

@facility=@hotel.build_facility

@klump,在尝试正确的语法后,该语法不正确是:

<%= f.fields_for :facility do |fc|%>

因此,感谢 Amar,为我指明了正确的方向。

于 2012-04-17T10:07:22.607 回答