accepts_nested_attributes_for를 사용하면 원본이 필요하다는 확인이있을 때 막혔습니다. 이 코드는 해당 문장을 정리하는 데 도움이됩니다. 나는 현재 rails3.beta4에게활성 레코드에서 다른 모델에 의해 레코드가 작성되었는지 확인하는 방법이 있습니까?
을 사용하고
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
내가하지 않는 당신에게
아아 감사 이 게시물에 대한 답변을 가지고 있지만, 나는 다른 방법을 생각해 냈습니다. 그래서 나는 검증 할 필요가 없었습니다.
바는 foo가 없으면 없어야하므로 foo_id없이 바를 만드는 요청은 오류입니다. 실제 예제에서 foo는 프로젝트이고 bar는 입찰입니다. 이것은 중첩 된 리소스이지만, 라우터가 보이도록/bids 위치에서 정보를 쿼리 할 수 있도록 json 앱에 대한 액세스 권한을 부여하려고했습니다. 이 다음 부분은 크게 안된하지만 지금까지 원하는 동작이 : [프로젝트 @ 입찰] 등
resources :bids
resources :projects do
resources: bids
end
하고 난 그냥 확실 모든 HTML 액세스 사용 project_bids_path 또는 form_for했습니다. 내가 가장 확실히 그것을 가치가 있다고 생각하지 않습니다이 모든 일을 한 후, 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가 문제를 일으키고 그 유효성 검사가 작동하지 않으면 개선 될 수 있다고 생각하지만, 잠시 동안 코드를 살펴본 후에 정확하게 수정하는 방법이나 그만한 가치가 있는지는 잘 모릅니다.
서식 지정 주셔서 감사합니다. 내가 겪고있는 문제는 멋진 인터페이스를 만들려고하는 데서 오는 것입니다. 프로젝트의 JSon API 부분도 있습니다. 사실 바에는 입찰가가 있고, foo는 프로젝트입니다. 프로젝트를 만들 때 웹 UI에서 nested_attributes를 사용하여 입찰가를 설정할 수 있습니다. 프로젝트가 끝나면 nested_attributes를 사용하는 프로젝트 페이지에서 입찰가를 편집 할 수 있습니다. json 측에서는 누군가가 project_id를 사용하여 입찰가 컨트롤러에 게시하여 입찰가를 생성 할 수 있기를 원했습니다. 이렇게하려면 project_id가 존재한다는 확인이 필요합니다. 현재로서는 불행히도 컨트롤러에 있습니다. – daicoden
JS를 사용하여 json 기반 요청을 사용하지 않고도 항상 좋은 해결책을 찾을 수 있습니다. 예를 들어 입찰가에 대해 중첩 된 양식을 만든 다음 JS에서 링크/버튼을 만들어 새 입찰 양식을 추가합니다 (클릭만으로 원하는만큼의 입찰가를 추가 할 수 있습니다). 프로젝트를 편집/저장할 때 입찰가가 올바르게 저장됩니다. 이 솔루션에 관심이 있다면 몇 가지 예제 코드를 제공 할 수 있습니다 ;-) –
그게 좋은 생각입니다! 나는 아직도 당신이 그 검증을 설정할 수 있어야한다고 생각한다 !!! >. <그러나, 내가 계속 생각하고있는 예제들은 점점 더 고안되어 있습니다.프로젝트의 다른 부분에 자바 스크립트를 설치할 수 있다고 생각하지만 제안에 감사드립니다. 이 입찰 문제의 경우 프로젝트없이 입찰가가 존재할 수 없기 때문에 실제로 중첩 된 리소스로 만들 필요가있었습니다. 당신의 도움을 주셔서 감사합니다! – daicoden