2010-06-29 4 views
1

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가 문제를 일으키고 그 유효성 검사가 작동하지 않으면 개선 될 수 있다고 생각하지만, 잠시 동안 코드를 살펴본 후에 정확하게 수정하는 방법이나 그만한 가치가 있는지는 잘 모릅니다.

답변

0

우선 nested_attributes를 사용하면 컨테이너가 있음을 알 수 있습니다. 예제에서 : Foo를 저장하고 Bar에 중첩 된 양식이있는 경우 Bar는 Foo에 의해 작성됩니다.

바를 Foo와 함께 사용하는 것이 확실하다면 이런 유형의 검증을 할 필요가 없다고 생각합니다.

은 BTW, 추적 (Rails3에 대한 새로운 기본 구문) 등의 검증을 작성하려고 :

validates :foo, :presence => true 

희망이 도움이, 을 수행합니다.

+0

서식 지정 주셔서 감사합니다. 내가 겪고있는 문제는 멋진 인터페이스를 만들려고하는 데서 오는 것입니다. 프로젝트의 JSon API 부분도 있습니다. 사실 바에는 입찰가가 있고, foo는 프로젝트입니다. 프로젝트를 만들 때 웹 UI에서 nested_attributes를 사용하여 입찰가를 설정할 수 있습니다. 프로젝트가 끝나면 nested_attributes를 사용하는 프로젝트 페이지에서 입찰가를 편집 할 수 있습니다. json 측에서는 누군가가 project_id를 사용하여 입찰가 컨트롤러에 게시하여 입찰가를 생성 할 수 있기를 원했습니다. 이렇게하려면 project_id가 존재한다는 확인이 필요합니다. 현재로서는 불행히도 컨트롤러에 있습니다. – daicoden

+0

JS를 사용하여 json 기반 요청을 사용하지 않고도 항상 좋은 해결책을 찾을 수 있습니다. 예를 들어 입찰가에 대해 중첩 된 양식을 만든 다음 JS에서 링크/버튼을 만들어 새 입찰 양식을 추가합니다 (클릭만으로 원하는만큼의 입찰가를 추가 할 수 있습니다). 프로젝트를 편집/저장할 때 입찰가가 올바르게 저장됩니다. 이 솔루션에 관심이 있다면 몇 가지 예제 코드를 제공 할 수 있습니다 ;-) –

+0

그게 좋은 생각입니다! 나는 아직도 당신이 그 검증을 설정할 수 있어야한다고 생각한다 !!! >. <그러나, 내가 계속 생각하고있는 예제들은 점점 더 고안되어 있습니다.프로젝트의 다른 부분에 자바 스크립트를 설치할 수 있다고 생각하지만 제안에 감사드립니다. 이 입찰 문제의 경우 프로젝트없이 입찰가가 존재할 수 없기 때문에 실제로 중첩 된 리소스로 만들 필요가있었습니다. 당신의 도움을 주셔서 감사합니다! – daicoden

관련 문제