accepts_nested_attributes_for + assign_to не показывает поля - PullRequest
1 голос
/ 08 октября 2011

У меня есть две модели:

class User < ActiveRecord::Base
  acts_as_authentic
  has_many :orders
end

и

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

идея в том, что если пользователь уже вошел в систему, я просто хочу сделать заказ для этого пользователя, но если он не вошел в систему, то я попрошу его зарегистрироваться одновременно с оформлением заказа. вот форма для заказов

<%= form_for(@order) do |f| %>
  <div class="field">
    <%= f.label :quantity %><br />
    <%= f.number_field :quantity %>
  </div>

  <% if current_user %>
  <div class="field">
    <%= current_user.email%>
  </div>
  <%else%>
    <%= f.fields_for(:user) do |user_form| %>
        <%= render "newuser_fields", :f => user_form %>
    <% end %>
  <% end %>
  <div class="actions">
    <%= f.submit %>
  </div>
<% end %>

и поля новых пользователей:

<div class="field">
  <%= f.label :email %><br />
  <%= f.text_field :email %>
</div>
<div class="field">
  <%= f.label :password %><br />
  <%= f.password_field :password %>
</div>
<div class="field">
  <%= f.label :password_confirmation %><br />
  <%= f.password_field :password_confirmation %>
</div>

Проблема в том, что он не отображает поля для пользователя!

Есть предложения?

Ответы [ 2 ]

2 голосов
/ 08 октября 2011

В качестве альтернативы вы можете просто не использовать accepts_nested_attributes (и при этом использовать fields_for). Пользовательские данные будут тогда в params [: user] (или params [: order] [: user], или params [: users], не уверен, просто посмотрите в журнале сервера, после того как вы удалите acceptpts_nested_attributes, потому что это изменит поле название). Таким образом, вы можете просто сначала создать пользователя вручную в действии контроллера:

@user = current_user || User.create!(params[:user])
@order = @user.orders.build(params[:order])

Дополнительным преимуществом является то, что у вас немного больше контроля, и это всего на 1 строчку больше.

2 голосов
/ 08 октября 2011

У пользователя много заказов, поэтому accepts_nested_attributes_for будет использоваться в модели пользователя.

http://api.rubyonrails.org/classes/ActiveRecord/NestedAttributes/ClassMethods.html

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

Обычно, если user не существует, он будет перенаправлен на страницу регистрации. Если вы не хотите этого, вы можете сделать что-то вроде следующего в вашем OrderController#new action

if current_user
  @order=current_user.orders.build
else
  @user=User.new
end

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

# app/views/order/_form.html.erb
<% if user_signed_in? %>
  //order form

<% else %>
  // user form 
  <% form_for @user do |uf| %>
    <%= uf.text_filed :email %>
    <%= uf.password_filed :password %>
    //now order fileds
    <%= uf.fields_for :orders do |of| %>
      //porder fileds 
    <% end %>
  <% end %>
<% end %>

Затем в create действии для пользователя и заказа необходимо добавить соответствующую проверку

Вот хак, показывающий, как вы можете использовать accepts_nested_attributes_for с belongs_to:

accept_nested_attributes_for с принадлежащим_ к полиморфному

...