在早期阶段,我的form_for看起来像这样:
<%= form_for [:dashboard, @article], html: {class: 'article_form'} do |f| %>
并且在基于@article
创建或更新时它已经知道。但后来我需要添加一个额外的参数,让它命名为article_type
。我在路线中添加了这样的内容:
resources :articles, path: 'articles/:article_type', constraints: { type: /image|video/ }
然后在this section of form_for中提到我可以做类似的事情,
<%= form_for [:dashboard, @article], url: {article_type: 'image'}, html: {class: 'article_form'} do |f| %>
得到我想要的东西,只要我省略:controller
或:action
,就可以正确地生成它。但它似乎没有这样做......
我一直得到的是:
如果@article是新的
<form accept-charset="UTF-8" action="/dashboard/articles/image/new" class="article_form" id="new_article" method="post">
如果@article存在:
<form accept-charset="UTF-8" action="/dashboard/articles/image/new" class="article_form" id="edit_article_3" method="post">
查看它仅创建/new
的位置,这是错误的,因为对于创建操作应为/dashboard/articles/image
,如果编辑则为/dashboard/articles/image/3
。
修改
临时解决方案我必须让它发挥作用
<%
named_route = if @article.new_record?
dashboard_articles_path(@article, article_type: params[:article_type])
else
dashboard_article_path(@article, article_type: params[:article_type])
end
%>
<%= form_for [:dashboard, @article], url: named_route, html: {class: 'article_form'} do |f| %>