2012-05-14 5 views
1

에 게시 내 경로입니다 :레일 라우팅 같은 경로 이름 여기에

root :to          => 'sites#index' 
match 'sites'         => 'sites#index' 
match 'sites/:site'       => 'sites#show' 
match 'sites/:site/publish'     => 'sites#publish', :via => :get 
match 'sites/:site/publish'     => 'sites#push', :via => :put 
match 'sites/:site/:entity_type'    => 'entity#index' 
match 'sites/:site/:entity_type/new'   => 'entity#new', :via => :get 
match 'sites/:site/:entity_type/new'   => 'entity#create', :via => :put 
match 'sites/:site/:entity_type/:entity_name' => 'entity#edit', :via => :get 
match 'sites/:site/:entity_type/:entity_name' => 'entity#update', :via => :put 

제가하는 데 문제는 내가의 POST를 할 때 실제로에서 액션 메소드를 호출하지 않습니다 경로를 게시 할 것입니다 모든. 그것은 "게시"(지정 안) entity_type_ 매개 변수로 설정 "한다고 여기

내 폼의 :. 사실

<%= form_tag({:controller => 'sites', :action => 'publish'}) do %> 
    <%= hidden_field_tag 'site', params[:site] %> 

    <%= submit_tag 'Publish' %> 
<% end %> 

, 나는 숨겨진 필드를 지정하지 않아도이 작업이 완료 될 때 .

Started POST "/sites/kieransenior/publish" for 127.0.0.1 at 2012-05-14 20:35:48 +0100 
Processing by EntityController#index as HTML 
    Parameters: {"utf8"=>"✓", "authenticity_token"=>"bCooYei5XTbfNv4MwXqrYAvBzazdcCZpHr7HufKPcxo=", "site"=>"kieransenior", "commit"=>"Publish", "entity_type"=>"publish"} 
Completed 500 Internal Server Error in 1ms 

HTML 양식은 (명확성을 위해) 다음과 같습니다 : 내가 공격 할 때 경로의 결과로 이런 것입니다 "게시"

<form accept-charset="UTF-8" action="/sites/kieransenior/publish" method="post"><div style="margin:0;padding:0;display:inline"><input name="utf8" type="hidden" value="&#x2713;" /><input name="authenticity_token" type="hidden" value="bCooYei5XTbfNv4MwXqrYAvBzazdcCZpHr7HufKPcxo=" /></div> 
    <input id="site" name="site" type="hidden" value="kieransenior" /> 

    <input name="commit" type="submit" value="Publish" /> 
</form> 

잘못된 장소로 POST하는 원인은 무엇입니까? 그것은 내 라우팅이되어야합니다, 모양이 올바른지. 푸시에 대한

편집

컨트롤러 액션 : 내 뇌가 망했다면 위의

def push 
    respond_to do |format| 
     redirect_to :controller => 'sites', :action => 'show', :site => params[:site] 
    end 
end 

스크랩, 도움이 될 것이다. 내가 redirect_to를 거기에 쏟아 부은 것처럼 보이고 respond_to를 제거하지 않은 것 같습니다. 오케이.

답변

1

match를 사용하는 대신 (당신은 아마한다)를 사용하는 대신 단순히의 match 말에 계획 get, post, put 또는 어떤 동사를 사용할 수 있습니다.

예를 들어, 대신 당신이 언급하고있는 두 경로에 대해이 작업을 수행 할 수 :

get 'sites/:site/publish'  => 'sites#publish' 
post 'sites/:site/publish' => 'sites#push' 

편집

당신은 다음 게시물을 406 오류가 발생하는 경우처럼 보이는 제출 된 콘텐츠 형식의 형식과 관련이 없으므로 거부됩니다. 당신이 respond_to를 사용하는 경우

, 일반적으로 당신은 콘텐츠 유형 및 각 유형에 대해 할을 지정 - 뭔가를 같이 :

당신에
respond_to do |format| 
    format.html 
    format.xml { render :xml => @people.to_xml } 
end 

, 같은 형식 사양이있을 것 같지 않습니다 :

def push 
    respond_to do |format| 
     redirect_to :controller => 'sites', :action => 'show', :site => params[:site] 
    end 
end 

일반적으로 당신이 respond_to 절에 콘텐츠 형식을 제출했지만, (예를 들어 respond_to에 지정된 콘텐츠 형식이없는 의미 406 오류가에 게시). format.json 절이 없습니다. 귀하의 경우에는 형식 조항이 없으므로 이것이 406 인 이유입니다.

def push 
    redirect_to :controller => 'sites', :action => 'show', :site => params[:site] 
end 
+0

리디렉션이 작동하지 않는 경우를 사용하여 작동합니다. URL은 동일하게 유지되지만 명령 프롬프트에 다음과 같은 내용이 표시됩니다. Started POST "/ sites/kieransenior/publish"on 127.0.0.1 2012-05-14 20:54:05 +0100 SitesController에 의한 처리 # push as HTML 매개 변수 : http : // localhost :로 리디렉션 됨 { 3000/sites/kieransenior 완료 406 9ms에서 허용되지 않음 (ActiveRecord : 0.0ms) – Kezzer

+0

컨트롤러가 'push'메소드와 어떤 유사점이 있습니까? 일반적으로 '406'은 컨트롤러가 어떤 이유로 게시를 거부하고 있음을 의미합니다. –

+0

원래 게시물을 수정했습니다. 사실, 일치하지 않고 가져 오기/보내기를 사용하면 다른 양식에 대한 업데이트가 작동하지 않습니다. – Kezzer

2
post 'sites/:site/publish'     => 'sites#publish' 
+0

를 통해 무엇 다음과 일치 :

당신이 respond_to을 사용하는 특별한 이유가없는 한 그래서, 난 그냥 지금은 그것을 제거하고 떠나 권하고 싶습니다? 나는 항상 내가하고있는 방식이 그것이 이루어지기위한 방법이라고 생각 해왔다. 나는 속였습니다! – Kezzer