【问题标题】:Rails3 association and accepts_nested_attributes_for failing when validation of user_id onRails3关联和accepts_nested_attributes_for在验证user_id时失败
【发布时间】:2012-12-07 12:57:55
【问题描述】:

我正在按照 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 教程中,对我来说非常有意义)?如果是,为什么 Measure 验证在开启时会失败?

非常感谢。

【问题讨论】:

  • 在您的measures/fields 部分中,您是否为user_id 提供了一个隐藏字段,以确保它在整个过程中得到执行?
  • 啊,不,我没有!但是 user_id 是不可访问的,在这个阶段它不会像我们在用户创建过程中那样退出。无论如何我会试试这个,谢谢
  • 好的,因为 :user_id 不可访问我收到错误无法批量分配受保护的属性:user_id
  • 是的,我想通了。您在 Measure 上设置了可访问属性,仅包含 weight。这是正确的行为
  • 你可以试试validates :user 而不是user_id。然后可能会发现这两者在内存中是关联的,即使用户还没有被保存。

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


【解决方案1】:

您可以尝试验证 :user 而不是 user_id。然后可能会发现这两者在内存中是关联的,即使用户还没有被保存。

【讨论】:

  • 这很完美,包括错误信息。非常感谢您的帮助
【解决方案2】:

我想我可能在您的代码中发现了会导致您看到的错误的错误。

在您的新控制器中,您专门创建了一个关联:

@user.measures.build

在您的创建控制器中,您根据传入的字段创建一个新元素。

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

在某些情况下关联的元素会被删除。我不记得默认情况下是否会发生这种情况,如果它没有验证,或者您需要设置一个选项以使其下降。

我想你可能需要添加

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

create 控制器else 子句中render :new 之前。

我不知道您是否真的遇到了这个问题,但它可以解释为什么没有设置与您的 User 的关联。

【讨论】:

  • 谢谢。我认为这不是真正的问题,但是您的解释是有道理的,所以我添加了这一行,因为我看不出它会造成什么伤害。
猜你喜欢
  • 2010-10-30
  • 1970-01-01
  • 2011-10-04
  • 1970-01-01
  • 2013-06-30
  • 1970-01-01
  • 2017-06-06
  • 1970-01-01
  • 2011-01-07
相关资源
最近更新 更多