2012-12-07 78 views
0

我正在按照Rails教程爲自己做一個小項目,然後嘗試進度。Rails3關聯和accept_nested_attributes_for在驗證user_id時失敗

嗯,我正面臨一個問題,我找到了解決方案,但我會很感激任何想法和意見,因爲要使它工作,我必須禁用關聯驗證。

上下文如下所示:應用程序(它實際上的大名稱...)讓用戶跟蹤其重量。我希望當用戶註冊時,他/她在旅途中輸入第一項措施。

所以這裏的簡化模型:

User.rb

class User < ActiveRecord::Base 
    attr_accessible :email, :name, :password, :password_confirmation, :measures_attributes 

    has_secure_password 

    has_many :measures, dependent: :destroy 
    accepts_nested_attributes_for :measures 

    # here goes validations before_save, etc. taken from the Rails Tutorial 
end 

Measure.rb

class Measure < ActiveRecord::Base 
    attr_accessible :weight 
    belongs_to :user 

    # This is kind where the problem is... 
    # If I deactivate the validation for user_id everyhing goes fine 
    validates :user_id, presence: true 
    validates :weight, presence: true, numericality: { greater_than: 0 } 

    default_scope order: 'measures.created_at ASC' 
end 

這裏是用戶控制器

class UsersController < ApplicationController 

    # GET /users/new 
    def new 
    @user = User.new 
    @user.measures.build 
    end 

    # POST /users 
    def create 

    @user = User.new(params[:user]) 

    if @user.save 
     sign_in @user 
     flash[:success] = "Hi #{@user.name}. Welcome !" 
     redirect_to @user 
    else 
     render :new 
    end 
    end 

end 

這裏是形成部分給用戶:

<%= form_for(user) do |user_form| %> 
    <%= render 'shared/error_messages', object: user_form.object %> 

    <%= render 'users/fields', user_builder: user_form %> 

    <%= user_form.fields_for :measures do |measure_fields| %> 
    <%= render 'measures/fields', measure_builder: measure_fields, full: true %> 
    <% end %> 

    <%= user_form.submit submit_text, class: 'btn btn-large btn-primary' %> 
<% end %> 

即使我正確地填寫表格,我得到這個錯誤:

* Measures user can't be blank 

我發現使它工作的唯一方法是擺脫了:USER_ID確認爲存在於測量模型。我想強調,當此驗證關閉時,用戶將被保存,度量將被保存並與新創建的用戶正確關聯。

我做錯了什麼? Measure模型中的user_id存在驗證真的很有用(它在Rails教程中,它對我來說很合理)?如果是,爲什麼測量驗證在打開時失敗?

非常感謝。

+0

在你的'度量/字段'中,你是否爲'user_id'提供了一個隱藏字段,以確保它能夠通過這個過程? –

+0

啊,不,我不知道!但user_id不可訪問,並且在此階段它不會退出,因爲我們在用戶創建過程中。 無論如何,我會試試這個,感謝 –

+0

確定爲:user_id是無法訪問我的錯誤 無法大規模指派保護的屬性:user_id說明 –

回答

1

您可以嘗試驗證:user而不是user_id。然後可能會發現,即使用戶尚未保存,這兩個內存仍然關聯在一起。

+0

完美的工作,包括錯誤信息。 非常感謝您的幫助 –

0

我想我可能在你的代碼中發現了一個錯誤,它會導致你看到的錯誤。

在新的控制器,你專門創建關聯:

@user.measures.build 

在你創建控制器,創建一個新的元素基礎上獲得通過,該領域

@user = User.new(params[:user]) 

有一些。關聯元素將被丟棄的情況。我不記得是否這是默認情況下發生,如果它沒有驗證,或者有一個選項,你需要設置,使其下降。

我想你可能需要在您create控制器else條款render :new之前添加

@user.measure.build if @user.measures.empty? 

我不知道你是否真的遇到了這個問題,但它可以解釋爲什麼你的User沒有設置關聯。

+0

謝謝。我認爲這不是真正的問題,但是你解釋的是有道理的,所以我添加了這條線,因爲我沒有看到它是如何造成傷害的。 –