Есть ли способ проверить, была ли запись построена другой моделью в активной записи? - PullRequest
1 голос
/ 29 июня 2010

При использовании acceptpts_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

Спасибо

Увы, у меня нет ответа на этот пост, но я придумал другой способ, поэтому мне не нужна проверка.

Так как бар долженникогда не быть без foo, тогда любой запрос на создание бара без foo_id является ошибкой.В реальном примере foo - это проект, а bar - это ставка.Это вложенный ресурс, но я хотел предоставить доступ к приложениям json, чтобы иметь возможность запрашивать информацию из местоположения / bids, чтобы маршрутизатор выглядел следующим образом.

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 голосов
/ 01 июля 2010

Прежде всего, при использовании nested_attributes вы получите присутствие контейнера. в примере: когда вы сохраняете Foo и есть также вложенная форма для Bar, то Bar строится из Foo.

Я думаю, что нет необходимости проводить такую ​​проверку, если вы уверены, что используете Bar только в контексте с Foo.

Кстати, попробуйте написать проверку следующим образом (новый предпочтительный синтаксис для Rails3):

validates :foo, :presence => true

надеюсь, это поможет, а.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...