Rails路由 - 使用相同的路由名称发布

时间:2012-05-14 19:37:41

标签: ruby-on-rails

这是我的路线:

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。糟糕。

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

使用match时,您可以改为(并且您可能应该)使用getpostput或您计划使用的任何动词,而不是简单地说{ {1}}。

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

match

修改

如果您收到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条款。在您的情况下,有 no 格式子句,因此这就是format.json

的原因。

因此,除非您有使用406的具体原因,否则我建议您暂时将其删除并离开:

respond_to