Принятие вложенных атрибутов в ассоциативную принадлежность - PullRequest
4 голосов
/ 04 октября 2010

У меня есть сложная форма для планирования событий. Вот сокращенные ассоциации:

class Event < ActiveRecord::Base
  belongs_to :client
  accepts_nested_attributes_for :client, :reject_if => lambda { |a| a[:name].blank? }
end

class Client < ActiveRecord::Base
  has_many :events
  has_many :questions, :dependent => :destroy
  accepts_nested_attributes_for :questions, :reject_if => lambda { |a| a[:content].blank? }
end

Форма создает новое событие, и у меня есть следующая структура:

- form_for @event do |event_form|
    %select=collection_select(client_options_for_select, :options, :group_name, :id, :name, @event.client_id)

   - event_form.fields_for :client do |client|
     = client.text_field :name

     - client.fields_for :questions do |question|
       = question.text_field :content

Клиент уже существует и выбирается из меню выбора. Наблюдатель отображает форму вложенных атрибутов, устанавливая клиентскую переменную в действии контроллера и затем визуализируя частичное.

Вот ошибка, которую я получаю:

ActionView::TemplateError (wrong number of arguments (0 for 1)) on line #1 of app/views/proceedings/_questions.html.haml:
1: - event_form.fields_for :client do |client|

app/views/proceedings/_questions.html.haml:1:in `form'
app/views/proceedings/_questions.html.haml:1:in `_run_haml_app47views47events47_client_questions46html46haml_locals_client_questions_object'
haml (3.0.21) rails/./lib/haml/helpers/action_view_mods.rb:13:in `render'
app/controllers/proceedings_controller.rb:261:in `__instance_exec0'
app/controllers/proceedings_controller.rb:260:in `corp_client_questions'
app/controllers/proceedings_controller.rb:258:in `corp_client_questions'

У меня проблемы (я думаю) с ассоциацией принадлежащих между Event и Client. Я не знаю, может ли Событие принять вложенные атрибуты Клиента, когда Событие принадлежит Клиенту. Я всегда делал это наоборот (Клиент принимает вложенные атрибуты Event).

Есть идеи? Я могу уточнить, если вам нужно больше кода или фона. Спасибо!

Обновление: добавлен код контроллера по запросу.

def client_questions
if params[:client_id].blank?
  render_no_client_questions
elsif @client = Client.find(params[:client_id]) and @client.is_unspecified?
  render_no_client_questions
else
  respond_to do |format|
    format.js {
      render :update do |page|
        page[:client_questions].replace_html :partial => 'client_questions', :layout => false
      end
    }
  end
end

конец

Ответы [ 3 ]

7 голосов
/ 04 октября 2010

попробуйте добавить экземпляр объекта fields_for в опциях ... обычно символа недостаточно при создании нового объекта формы верхнего уровня ... Попробуйте следующее, но да, можно принять вложенные атрибуты напринадлежит_. 1001

<%= event_form.fields_for :client, @client do |client| %>
  <%= client.text_field :name %>
  <%= client.fields_for :questions, Question.new do |question| %>
    <%= question.text_field :content %>
  <% end %>
<% end %>
2 голосов
/ 30 января 2014

У меня возникла та же проблема с использованием accepts_nested_attributes_for :address в ассоциации Address_to: Address для моего объекта Order.

field_for ничего не отражало, но все, что нужно было добавить @order.build_address() и это заставило его работать.

Я думаю, это потому, что мы используем ассоциацию в некотором роде, поэтому вам нужно вручную создать ассоциацию.

0 голосов
/ 24 января 2016

В методе (ах) вашего контроллера вам нужно добавить:

@event.build_client

Форма не может отображать fields_for, если у нее нет действительного объекта. В большинстве случаев мы используем что-то вроде @event.client.build, но это не будет работать с ассоциацией принадлежащей к. Этот метод допустим только для has_many и has_and_belongs_to_many.

Ссылка здесь .

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