2012-11-08 5 views
1

옵션 요청에 대해서만 리소스 라우트를 무시하려고합니다. Cross Domain 사진 업로드 요청을 제대로 받으려면이 기능이 필요합니다.레일즈 2에서 리소스 경로 재정의

routes.rb

map.resources :photos 
map.connect '/photos', :controller => 'photos', 
    :action => 'options_stuff', :conditions => {:method => :options } 

photos_controller.rb 그것이 내가 필요로하는 컨트롤러에 도달하지 그러나

def options_stuff 
    puts "got to [email protected]!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!" 
    set_access_control_headers 
    head :ok 
    render :nothing => true, :status => 200 
end 


def set_access_control_headers 
    headers['Access-Control-Allow-Origin'] = '*' 
    headers['Access-Control-Allow-Methods'] = 'POST, GET, OPTIONS' 
    headers['Access-Control-Max-Age'] = '1000' 
    headers['Access-Control-Allow-Headers'] = '*,x-requested-with' 
    puts "headers are #{headers}" 
end 

. 내가 도대체 ​​뭘 잘못하고있는 겁니까? 이 일을 했더라도, http://www.codeodor.com/index.cfm/2011/7/26/Responding-to-the-OPTIONS-HTTP-method-request-in-Rails-Getting-around-the-Same-Origin-Policy/3387

https://gist.github.com/832700

업데이트 많은 고통 내가 컨트롤러 아이디어를 폐기 고뇌 후 : Btw는

, 나는 그것을 수행하는 방법에 대한 다음의 두 기사를 다음입니다 대답과 비슷합니다. 대신 사람과 같이 필터 전에를 사용하는 것이 좋습니다 :

before_filter :set_access_control_headers, :only => [:index] 


def set_access_control_headers 
    if !request.put? && !request.post? && !request.delete? && !request.get? 
    headers['Access-Control-Allow-Origin'] = '*' 
    headers['Access-Control-Allow-Methods'] = 'POST, GET, OPTIONS' 
    headers['Access-Control-Max-Age'] = '1000' 
    headers['Access-Control-Allow-Headers'] = '*,x-requested-with' 
    puts "headers are #{headers}" 

    render :nothing => true, :status => 200 
    return false 
    end 
end 
+0

경로에서 행동 이름이 잘못되었습니다. options_stuff가 아닌가? – Ashitaka

+0

고마워요. 하지만 그렇지 않다 –

+0

컨트롤러에서'printf' 디버깅이 아마도 최선의 방법은 아니지만, 적어도 여러분은 그것에 대해 흥분하고 있습니다. – tadman

답변

3

설정하기 전에이 경로는 위에서 아래로 우선 순위 믿고, 상단 하나되는 가장 높은 우선 순위 및 하단 한 가장. 따라서 다음과 같이 경로를 전환하는 것이 좋습니다.

map.connect '/photos', :controller => 'photos', 
:action => 'options_stuff', :conditions => {:method => :options } 
map.resources :photos 
+1

첫 번째 정의의 우선 순위가 가장 높습니다. 이것은 슬프게도 일반적으로 마지막 하나가 붙어있는 루비의 반대입니다. – tadman

+0

그래, 명확하게 편집! –

+0

잘 작동 해 주셔서 감사합니다. 이제 자원이 또한 렌더링을 시도하고 있기 때문에 이중 렌더링을 얻었습니다 :'ActionController :: DoubleRenderError in OptionsController # options_stuff' –