Ruby on Rails: создание записей для нескольких моделей с одной формой и одной отправкой

У меня есть 3 модели: цитата, клиент и товар. У каждой цитаты есть один клиент и одна вещь. Я хотел бы создать новую цитату, нового клиента и новый элемент в соответствующих таблицах, когда я нажимаю кнопку отправки. Я смотрел на другие вопросы и Railscast, или они не работают для моей ситуации, или я не знаю, как их реализовать.

quote.rb

class Quote < ActiveRecord::Base
  attr_accessible :quote_number
  has_one :customer
  has_one :item
end

customer.rb

class Customer < ActiveRecord::Base
  attr_accessible :firstname, :lastname
  #unsure of what to put here
  #a customer can have multiple quotes, so would i use has_many or belongs_to?
  belongs_to :quote
end

item.rb

class Item < ActiveRecord::Base
  attr_accessible :name, :description
  #also unsure about this
  #each item can also be in multiple quotes
  belongs_to :quote

quotes_controller.rb

class QuotesController < ApplicationController
  def index
    @quote = Quote.new
    @customer = Customer.new
    @item = item.new
  end

  def create
    @quote = Quote.new(params[:quote])
    @quote.save
    @customer = Customer.new(params[:customer])
    @customer.save
    @item = Item.new(params[:item])
    @item.save
  end
end

items_controller.rb

class ItemsController < ApplicationController
  def index
  end

  def new
    @item = Item.new
  end

  def create
    @item = Item.new(params[:item])
    @item.save
  end
end

customers_controller.rb

class CustomersController < ApplicationController
  def index
  end

  def new
    @customer = Customer.new
  end

  def create
    @customer = Customer.new(params[:customer])
    @customer.save
  end
end

моя форма для цитат /new.html.erb

<%= form_for @quote do |f| %>
  <%= f.fields_for @customer do |builder| %>
    <%= label_tag :firstname %>
    <%= builder.text_field :firstname %>
    <%= label_tag :lastname %>
    <%= builder.text_field :lastname %>
  <% end %>
  <%= f.fields_for @item do |builder| %>
    <%= label_tag :name %>
    <%= builder.text_field :name %>
    <%= label_tag :description %>
    <%= builder.text_field :description %>
  <% end %>
  <%= label_tag :quote_number %>
  <%= f.text_field :quote_number %>
  <%= f.submit %>
<% end %>

Когда я пытаюсь подтвердить, что получаю сообщение об ошибке:

Can't mass-assign protected attributes: item, customer

Поэтому, чтобы попытаться это исправить, я обновил attr_accessible в quote.rb, включив в него: item,: customer, но затем я получаю эту ошибку:

Item(#) expected, got ActiveSupport::HashWithIndifferentAccess(#)

Любая помощь будет принята с благодарностью.

7 голосов | спросил notblakeshelton 27 J0000006Europe/Moscow 2013, 01:33:07

2 ответа


0

Чтобы отправить форму и связанные с ней дети, вам необходимо использовать acceptpts_nested_attributes_for

Для этого вам нужно объявить это в модели для контроллера, который вы собираетесь использовать (в вашем случае это похоже на контроллер цитирования.

class Quote < ActiveRecord::Base
  attr_accessible :quote_number
  has_one :customer
  has_one :item
  accepts_nested_attributes_for :customers, :items
end

Кроме того, необходимо убедиться, что вы объявили, какие атрибуты доступны , так что Вы избегаете других ошибок массового присваивания.

ответил creativereason 27 J0000006Europe/Moscow 2013, 02:15:26
0

Если вы хотите добавить информацию для различных моделей, я предлагаю применить nested_model_form, например, по этой ссылке:" rel =" nofollow "> http://railscasts.com/episodes/196-nested-model-form-part-1?view=asciicast .

Это решение очень простое и чистое.

ответил kikicarbonell 27 J0000006Europe/Moscow 2013, 02:19:47

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132