Ruby: UnknownAttributeError - PullRequest
       10

Ruby: UnknownAttributeError

1 голос
/ 30 марта 2010

У меня есть несколько заказов, которые могут иметь несколько предметов, и эти предметы имеют связанный вид. Вид может принадлежать многим предметам. но я получаю "неизвестный атрибут: виды" в моем OrdersController, когда я нажимаю кнопку отправки формы Кстати, я использую вложенные формы.

Order.rb

class Order < ActiveRecord::Base
  validates_presence_of :ref_nr, :total_price

  has_many :items, :dependent => :destroy
  has_many :kinds, :through => :items

  accepts_nested_attributes_for :items
  accepts_nested_attributes_for :kinds

  validates_associated :items
  validates_associated :kinds


end

item.rb

class Item < ActiveRecord::Base
  belongs_to :order
  has_one :kind

  accepts_nested_attributes_for :kind

  validates_associated :kind
end

Kind.rb

class Kind < ActiveRecord::Base
 belongs_to :items
end

OrdersController.rb: Создать

def create
    @order = Order.new(params[:order])
end

new.erb.html

<% form_for @order do |f| %>
  <%= f.error_messages %>

  <% f.fields_for :items do |builder| %>
    <table>
    <tr>
      <% builder.fields_for :kinds do |m| %>
        <td><%= m.collection_select :kind, Kind.find(:all, :order => "created_at DESC"), :id, :name, {:prompt   => "Select a Type" }, {:id => "selector", :onchange => "kind_change(this)"} %></td>
    <% end %>
      <td><%= builder.text_field :amount, :id => "amountField", :onchange => "change_total_price()" %></td>
      <td><%= builder.text_field :text, :id => "textField" %></td>
      <td><%= builder.text_field :price, :class => "priceField", :onChange => "change_total_price()" %></td>
      <td><%= link_to_remove_fields "Remove Item", f %></td>
    </tr>
    </table>
    <% end %>
    <p><%= link_to_add_fields "Add Item", f, :items %></p>
    <p>
      <%= f.label :total_price %><br />
      <%= f.text_field :total_price, :class => "priceField", :id => "totalPrice" %>
    </p>
    <p><%= submit_tag %></p>
<% end %>

я не вижу, чего мне не хватает

1 Ответ

2 голосов
/ 30 марта 2010

Вы должны удалить accepts_nested_attributes_for :kinds в модели заказа, и она должна быть в модели товара (как в вашем коде).Затем измените представление здесь:

...
<% f.fields_for :items do |builder| %>
  <table>
    <tr>
      <% builder.fields_for :kind do |m| %>
...

И я думаю, что вы также допустили ошибку в следующих строках:

<td><%= f.text_field :amount, :id => "amountField", :onchange => "change_total_price()" %></td>
<td><%= f.text_field :text, :id => "textField" %></td>
<td><%= f.text_field :price, :class => "priceField", :onChange => "change_total_price()" %></td>

Если поля amount, text и price связаныс моделью элемента, тогда вы должны использовать builder вместо f:

<td><%= builder.text_field :amount, :id => "amountField", :onchange => "change_total_price()" %></td>
<td><%= builder.text_field :text, :id => "textField" %></td>
<td><%= builder.text_field :price, :class => "priceField", :onChange => "change_total_price()" %></td>

РЕДАКТИРОВАТЬ (чтобы ответить на дополнительные вопросы из комментариев):

Вы должны иметь:

<% f.fields_for :items do |builder| %>
  <table>
    <tr>
      <td><%= builder.collection_select :kind_id, Kind.find(:all, :order => "created_at DESC"), :id, :name, {:prompt   => "Select a Type" }, {:id => "selector", :onchange => "kind_change(this)"} %></td>  
      <td><%= builder.text_field :amount, :id => "amountField", :onchange => "change_total_price()" %></td>
      <td><%= builder.text_field :text, :id => "textField" %></td>
      <td><%= builder.text_field :price, :class => "priceField", :onChange => "change_total_price()" %></td>

и так далее ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...