【发布时间】:2010-06-29 09:11:05
【问题描述】:
当使用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 的 bar 的请求都是错误的。在实际示例中, foo 是一个项目,而 bar 是一个投标。这是一个嵌套资源,但我想授予对 json 应用程序的访问权限,以便能够从 /bids 位置查询信息,因此路由器看起来像。
resources :bids
resources :projects do
resources: bids
end
然后我只需要确保所有 html 访问都使用 project_bids_path 或 form_for [:project,@bid] 等。下一部分很大程度上未经测试,但到目前为止所需的行为已经存在。我从 Yehuda 关于通用操作的帖子中得到了这个想法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 破坏了一些东西,如果验证不起作用,可以改进,但是在浏览了一段时间代码后,我不确定如何修复它或者是否值得。
【问题讨论】:
标签: ruby activerecord ruby-on-rails-3