【问题标题】:accepts_nested_attributes_for + belongs_to does not show fieldsAccepts_nested_attributes_for + belongs_to 不显示字段
【发布时间】:2011-10-08 01:05:22
【问题描述】:

我有两个模型:

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>

问题是它不会为用户显示字段!

有什么建议吗?

【问题讨论】:

    标签: ruby-on-rails-3 activerecord nested-attributes


    【解决方案1】:

    用户有很多订单,所以accepts_nested_attributes_for将用于用户模型。

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

    如果父级不存在,则无法保存嵌套资源,因此您将先创建用户,然后再创建其订单。

    通常,如果user 不存在,将被重定向到注册页面。如果您不想这样做,您可以在OrderController#new 操作中执行类似以下操作

    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 用户和订单操作中,您必须添加适当的检查

    这是一个 hack,展示了如何将 accepts_nested_attributes_forbelongs_to 一起使用:

    accepts_nested_attributes_for with belongs_to polymorphic

    【讨论】:

      【解决方案2】:

      或者,您可以不使用accepts_nested_attributes(并且仍然使用fields_for)。然后,用户数据将在 params[:user] (或 params[:order][:user] 或 params[:users],不确定,只需查看服务器日志,在您删除 Accepts_nested_attributes 后,因为这会改变字段姓名)。因此,您可以先在控制器创建操作中手动创建用户:

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

      额外的好处是您可以通过这种方式获得更多控制权,而且只多出 1 行。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-05-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多