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 时,它实际上根本没有调用 action 方法。它指出“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,您可以(并且您可能应该)使用get,或您打算使用的任何动词postput而不是简单地说match

例如,您可以对您所指的两条路线执行此操作:

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

编辑

看起来如果您遇到406错误,那么您的帖子会被拒绝,因为您没有具体说明提交的内容类型的格式。

如果您使用 a 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 回答