【问题标题】:Validation association not working验证关联不起作用
【发布时间】:2013-06-14 18:31:29
【问题描述】:

我有两个模型:位置和用户。位置has_many :users 和用户belongs_to :location。现在我有一个使用类似于以下内容的表单:

 <%= form_for @user do |f| %>
 ...
   <%= f.select(:location,:location_id,Location.all.collect{|location| location.name}) %>
 ...
 <%end%>

经过检查,它似乎为它生成了正确的表单字段:

 <select id="user_location_id" name="user[location_id]">
    <option value="Clearfield">Clearfield</option>
    <option value="San Diego">San Diego</option>
  </select>

根据Ruby on Rails: question about validates_presence_of validates_presence_of 应该适用于模型名称,并且在我的模型中我有:

用户.rb:

  class User < ActiveRecord::Base
       belongs_to :location
       validates_presence_of :location
   ...

Location.rb:

 class Location < ActiveRecord::Base
      has_many :users    
 ...

我做错了什么导致validates_presence_of 在我使用validates_presence_of :location 时看不到位置,但由于某种原因在我使用location_id 时有效?

【问题讨论】:

    标签: ruby-on-rails ruby ruby-on-rails-3 validation activemodel


    【解决方案1】:

    validates_presence_of :location在以下情况下不会添加错误:

    user = User.new(:location => Location.new)
    user.valid? # => true
    

    另一方面,如果location 与给定的id 不存在,validates_presence_of :location_id 不会添加错误:

    user = User.new(:location_id => 123)
    user.valid? #=> true
    Location.find_by_id(user.location_id) #=> nil
    

    【讨论】:

    • validates_presence_of :location 是问题中的拼写错误,已修复。你在第二次中提出了一个很好的观点。听起来像 validates_associated 也包括在内。
    【解决方案2】:

    当我注意到我的错误时,我写到这个问题的一半,但如果它对其他人有好处,我把它放在这里。

    可能会注意到生成的 HTML 不是选项值字段中的整数。这是名字。因此有问题的代码是:

    <%= f.select(:location,:location_id,Location.all.collect{|location| location.name}) %>
    

    这很容易解决,只需像这样添加 id:

    <%= f.select(:location,:location_id,Location.all.collect{|location| [location.name,location.id]}) %>
    

    一旦我这样做了,这些值就变成了整数,并且在提交表单后,我知道不再收到一个错误,指出我需要输入位置值。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-09
      • 2012-12-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多