Rails嵌套模型表单:验证外键的存在,除非用户创建新记录

ste*_*och 4 ruby-on-rails

有一个非常简单的rails应用程序,这是我的代码:

class Post < ActiveRecord::Base
  belongs_to :category
  attr_accessible :category_id, :category_attributes    
  accepts_nested_attributes_for :category, :reject_if => :all_blank
end

class Category < ActiveRecord::Base
  has_many :posts
end

#app/views/posts/_form.html.haml
= simple_form_for(@post) do |f|
  = f.association :category
  = f.simple_fields_for :category do |cat_f|
    = cat_f.input :name    
Run Code Online (Sandbox Code Playgroud)

因此,在创建新帖子时,我可以选择一个类别(从选择菜单中)或创建一个新类别(如果它不存在).

我想验证category_id是否存在,除非用户选择创建新类别

我猜是有某种类型的rails方法来解决这个问题 - 我知道我不能只是添加,validates :category_id, :presence => true因为这会导致表单提交失败,当用户决定创建一个新类别(并没有从中选择一个落下).

第二个问题: 我最近阅读了一个有用的rails教程,向您展示如何在显示类别选择菜单和新类别字段之间切换,以便在任何给定时间屏幕上只显示两个中的一个.任何人都有这样的链接?

ste*_*och 11

我想我已经通过替换来解决这个问题:

validates :category_id, :presence => true
Run Code Online (Sandbox Code Playgroud)

validates :category, :presence => true
Run Code Online (Sandbox Code Playgroud)

它似乎工作.奇怪的一个.

PS

我只能想象,这个工作,因为:category被视为存在,如果用户从下拉列表中选择的东西如果他们创建使用嵌套形式的新的类别,而以前,我的原代码,:CATEGORY_ID才被认为存在当用户从下拉列表中选择了某些内容,而不是在他们创建新记录时.