Ruby on rails: fields_for ничего не делать, если определено submodel_attributes = - PullRequest
0 голосов
/ 26 июня 2010

У меня есть такой код в 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

или

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

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

Rails: 2.3.8

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

Ответы [ 5 ]

4 голосов
/ 23 июля 2011

просто добавьте = ( EQUAL ) после <% в полях f.fields_for </p>

как это:

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

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

0 голосов
/ 23 января 2011

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

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

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

на

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

Вот и все.

0 голосов
/ 28 июня 2010

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

0 голосов
/ 29 июня 2010

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

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

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

@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
0 голосов
/ 26 июня 2010

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

# 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.

...