验证关联不起作用

时间:2013-06-14 18:31:30

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

我有两种型号:位置和用户。位置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应该适用于模型名称,在我的模型中我有:

User.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时会有效?

2 个答案:

答案 0 :(得分:1)

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

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

另一方面,validates_presence_of :location_id如果location存在id并且不存在错误,则不会添加错误:

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

答案 1 :(得分:0)

当我注意到我的错误时,我写了这个问题的中途,但是如果它让别人受益我就把它放在这里了。

有人可能会注意到生成的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]}) %>

一旦我这样做了,这些值就变成了整数,并且在表格中我知道更长时间会出现错误,说明我需要为位置输入一个值。