这是我的路线:
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="✓" /><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。糟糕。
答案 0 :(得分:2)
post 'sites/:site/publish' => 'sites#publish'
答案 1 :(得分:1)
使用match
时,您可以改为(并且您可能应该)使用get
,post
,put
或您计划使用的任何动词,而不是简单地说{ {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