2011-10-08 72 views
1

我有兩個型號:accepts_nested_attributes_for + belongs_to的不顯示領域

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

用戶有很多訂單,所以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 

而且在您的訂單,你可以檢查,如果用戶簽到只需創建訂單,如果不能創造用戶窗體,然後添加以下你的在create行動用戶和訂單嵌套申請順序

# 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_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線以上。