Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ruby-on-rails-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 3 接受+所属的\u嵌套的\u属性\u不显示字段_Ruby On Rails 3_Activerecord_Nested Attributes - Fatal编程技术网

Ruby on rails 3 接受+所属的\u嵌套的\u属性\u不显示字段

Ruby on rails 3 接受+所属的\u嵌套的\u属性\u不显示字段,ruby-on-rails-3,activerecord,nested-attributes,Ruby On Rails 3,Activerecord,Nested Attributes,我有两种型号: class User < ActiveRecord::Base acts_as_authentic has_many :orders end 及 这个想法是,如果用户已经登录,我只想为该用户下订单,但是如果他没有登录,那么我会要求他在下订单的同时注册。 这是订单单 <%= form_for(@order) do |f| %> <div class="field"> <%= f.label :quantity %>&l

我有两种型号:

class User < ActiveRecord::Base
  acts_as_authentic
  has_many :orders
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>
问题是它不会为用户显示字段

有什么建议吗?

用户有很多订单,因此接受嵌套的属性,以便在用户模型中使用

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

通常,如果用户不存在,将被重定向到注册页面。如果您不想这样做,您可以在OrderControllernew操作中执行以下操作

在您的订单中,您可以检查用户是否已登录,如果未创建用户表单,只需创建订单表单,然后为订单添加嵌套字段

# 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 %>
然后在“为用户和订单创建操作”中,您必须添加相应的检查

下面是一个演示如何使用accepts\u nested\u attributes\u for with attributes\u to:

用户有许多订单,因此接受嵌套的属性,以便在用户模型中使用

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

通常,如果用户不存在,将被重定向到注册页面。如果您不想这样做,您可以在OrderControllernew操作中执行以下操作

在您的订单中,您可以检查用户是否已登录,如果未创建用户表单,只需创建订单表单,然后为订单添加嵌套字段

# 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 %>
然后在“为用户和订单创建操作”中,您必须添加相应的检查

下面是一个演示如何使用accepts\u nested\u attributes\u for with attributes\u to:


或者,您可以不使用accepts\u嵌套的\u属性,而仍然使用字段\u。然后,用户数据将位于params[:user]或params[:order][:user]或params[:users]中,不确定,请在删除accepts\u nested\u属性后查看服务器日志,因为这将更改字段名。因此,您可以在控制器创建操作中首先手动创建用户:

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

额外的好处是,通过这种方式,您可以进行更多的控制,只需多出1行。

或者,您可以不使用accepts\u嵌套的属性,而仍然使用fields\u作为属性。然后,用户数据将位于params[:user]或params[:order][:user]或params[:users]中,不确定,请在删除accepts\u nested\u属性后查看服务器日志,因为这将更改字段名。因此,您可以在控制器创建操作中首先手动创建用户:

@user = current_user || User.create!(params[:user])
@order = @user.orders.build(params[:order])
额外的好处是,通过这种方式,您可以获得更多的控制权,只需多出1行