有没有办法检查记录是否由活动记录中的另一个模型构建?

时间:2010-06-29 09:11:06

标签: ruby activerecord ruby-on-rails-3

当使用accepts_nested_attributes_for时,我在进行验证时遇到困难,要求原件存在。该代码将有助于澄清该句子。

class Foo < ActiveRecord::Base
  has_one :bar
  accepts_nested_attributes :bar
end

class Bar < ActiveRecord::Base
  #property name: string
  belongs_to :foo
  validates_presence_of :foo #trouble line!
end

#now when you do
foo = Foo.create! :bar_attributes => {:name => 'steve'}
#you get an error because the bar validation failed

我想写一个类似......的验证。

class Bar < ActiveRecord::Base
  validates_presence_of :foo, :unless => :being_built_by_foo?
end

我目前正在使用rails3.beta4

谢谢

唉我对这篇文章没有答案,但是我提出了另一种方式,所以我不需要验证。

由于bar永远不应该没有foo,因此任何创建没有foo_id的栏的请求都是错误的。在真实示例中,foo是项目,bar是出价。它是一个嵌套资源,但我想访问json应用程序,以便能够从/ bid位置查询信息,以便路由器看起来像。

resources :bids
resources :projects do
  resources: bids
end

然后我只需要确保所有html访问都使用了project_bids_path或form_for [:project,@ bid]等。下一部分很大程度上未经测试但到目前为止所需的行为就在那里。我从耶胡达关于通用行为http://yehudakatz.com/2009/12/20/generic-actions-in-rails-3/

的帖子中得到了这个想法
#I'm sure there is a better way then map.connect
map.connect "projects/invalid_id", :controller => "projects", :action => "invalid_id"
resources :projects
  resources :bids
end

#couple of changes from Yehuda
def redirect(*args, &block)
  options = args.last.is_a?(Hash) ? args.pop : {}

  path = args.shift || block
  path_proc = path.is_a?(Proc) ? path : proc {|params| path % params }
  status = options[:status] || 301

  lambda do |env|
    req = Rack::Request.new(env)
    #Get both the query paramaters and url paramaters
    params = env["action_dispatch.request.path_parameters"].merge req.params
    url = path_proc.call(params.stringify_keys)
    #Doesn't add the port back in!
    #url = req.scheme + '://' + req.host + params
    #content-type might be a bad idea, need to look into what happens for different requests
    [status, {'Location' => url, 'Content-Type' => env['HTTP_ACCEPT'].split(',').first}, ['Moved Permanently']]
  end
end

def bid_path
  redirect do |params| 
    if params['project_id']
      "/projects/#{params['project_id']}/bids/#{params['id']}" 
    else
      '/projects/invalid_id'
    end
  end
end


match "bids", :to => bid_path
match "bids/:id", :to => bid_path
然而,在完成所有这些之后,我绝对不认为这是值得的。我认为nested_attributes会破坏一些东西,并且如果验证不起作用可以改进,但在查看代码一段时间之后我不确定如何修复它或者它是否值得。

1 个答案:

答案 0 :(得分:0)

首先,当使用nested_attributes时,您将获得容器的存在。在示例中:当您保存Foo并且还有一个用于Bar的嵌套表单时,Bar就是由Foo构建的。

我认为如果您确定仅在与Foo的上下文中使用Bar,则无需进行此类验证。

btw,尝试编写验证如下(Rails3的新首选语法):

validates :foo, :presence => true

希望这有帮助, 一个。