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>

間違った場所に投稿するために何が間違っていますか? フォームが正しいので、それを行っているのは私のルーティングであるに違いありません。

編集

プッシュのコントローラー アクション:

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

上記をスクラップしてください。脳がねじ込まれていれば役立ちます。ある時点でredirect_toをそこにダンプし、respond_toを削除しなかったようです。おっと。

4

2 に答える 2

2
post 'sites/:site/publish'                   => 'sites#publish'
于 2012-05-14T19:44:41.353 に答える
1

を使用するときは、単に と言う代わりに、 、、または使用する予定の動詞を代わりに使用matchできます (そしておそらく使用する必要があります) 。getpostputmatch

たとえば、参照している 2 つのルートに対して代わりにこれを行うことができます。

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

この406エラーは通常、コンテンツ タイプをrespond_to句に送信したが、そのコンテンツ タイプが に指定されていないことを意味しますrespond_to(たとえば、投稿されたが句/app/model.jsonがありませんでしたformat.json)。あなたの場合、フォーマット句がないため、406.

したがって、使用する特別な理由がない限りrespond_to、今のところ削除してそのままにしておくことをお勧めします。

def push
  redirect_to :controller => 'sites', :action => 'show', :site => params[:site]
end
于 2012-05-14T19:52:13.870 に答える