我有两种型号:位置和用户。位置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
时会有效?
答案 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]}) %>
一旦我这样做了,这些值就变成了整数,并且在表格中我知道更长时间会出现错误,说明我需要为位置输入一个值。