0

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

用户.rb:

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

位置.rb:

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

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

4

2 回答 2

1

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

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

另一方面,如果with given不存在,validates_presence_of :location_id则不会添加错误:locationid

user = User.new(:location_id => 123)
user.valid? #=> true
Location.find_by_id(user.location_id) #=> nil
于 2013-06-14T18:49:13.240 回答
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]}) %>

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

于 2013-06-14T18:31:29.933 回答