Ruby on rails: fields_for ничего не делает, если определено submodel_attributes=

У меня есть такой код в new.erb.html:

<% form_for(@ratification) do |f| %>
  <%= f.error_messages %>

  <% f.fields_for :user do |fhr| %>
    <p>
      <%= fhr.label :url %><br />
      <%= fhr.text_field_with_auto_complete :url %>
    </p>
  <% end %>
<% end %>  

Если у меня пустой Ratification.rb, то все в порядке, fields_for работает нормально.

Но если бы я написал:

class Ratification < ActiveRecord::Base
  belongs_to :user
  accepts_nested_attributes_for :user
end

or

class Ratification < ActiveRecord::Base
  belongs_to :user
  def user_attributes=(attr)
  ...
  end
end

f.fields_for ничего не дает! Почему!?

Рельсы: 2.3.8

Плагин для автозаполнения: repeated_auto_complete


person petRUShka    schedule 26.06.2010    source источник
comment
Я отредактировал свой ответ...   -  person Ju Nogueira    schedule 26.06.2010


Ответы (5)


просто добавьте = (EQUAL) после ‹% в f.fields_for

так:

<%= f.fields_for :user do |fhr| %>
    <p>
        <%= fhr.label :url %><br />
        <%= fhr.text_field_with_auto_complete :url %>
    </p>
<% end %>

obs: вы должны сделать то же самое в Rails 3

person Celso Dantas    schedule 23.07.2011

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

# controller
def new
   @ratification = Ratification.new
   @ratification.build_user
end

Что о

<% f.fields_for :user, @ratification.user do |fhr| %>
   # ...
<% end %>

?

Я верю, если вы используете

<% f.fields_for :user do |fhr| %>

у вас должно быть @user в качестве переменной экземпляра. Но в вашем случае у вас есть @ratification.user.

person Ju Nogueira    schedule 26.06.2010

Вы не можете переопределить user_attributes, так как вы перезапишете стандартное поведение, указанное для него ActiveRecord. Если вы все еще знаете это, вам нужно переопределить user_attributes, попробуйте использовать alias_method_chain .

person Fran    schedule 28.06.2010

Разве ты не делаешь это неправильно? Если ратификация принадлежит пользователю, то модель пользователя должна принимать вложенные атрибуты для ратификации, а не наоборот.

Таким образом, если у пользователей есть много ратификаций, и если вы хотите отправить несколько ратификаций для пользователя в одной форме, вы должны использовать вложенные атрибуты accept для ратификации в пользовательской модели.

И вы бы сделали где-нибудь в контроллере пользователей

@user = User.new
2.times { @user.ratifications.build } # if you want to insert 2 at a time

Я попытался сделать что-то подобное в консоли:

@user = User.new
@user.ratifications.build # this works

Но если бы я сделал

@ratification = Ratification.new
@ratification.user.build # this fails
person kentor    schedule 29.06.2010

Я только что столкнулся с той же проблемой и смог ее исправить. Проблема заключалась в том, что fields_for принимает :user в качестве аргумента, а аргумент должен быть @ratification.user

Следовательно, заменить

<% f.fields_for :user do |fhr| %>

с участием

<% f.fields_for @ratification.user do |fhr| %>

Вот и все.

person Jessie Dedecker    schedule 23.01.2011