我正在按照 Rails 教程为自己做一个小项目,然后尝试进步。
好吧,我正面临一个我找到解决方案的问题,但我真的很感激任何想法和意见,因为要让它工作,我必须禁用关联中的验证。
上下文如下:该应用程序(它实际上所做的大名鼎鼎......)让用户跟踪他们的体重。我希望当用户注册时,他/她在旅途中输入第一个措施。
所以这里是简化的模型:
用户.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
测量.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 模型中。我想强调的是,当此验证关闭时,用户被保存,度量被保存并与新创建的用户正确关联。
难道我做错了什么 ?Measure 模型中的 :user_id 存在验证真的有用吗(它在 Rails 教程中,对我来说非常有意义)?如果是,为什么打开时测量验证失败?
提前非常感谢。