这是我在路线档案中的路线
get '/signup/:plan/:discount' =>'accounts#new', plan: nil, discount: 0, as: :new_account
我在我的html文件中调用此路由,如下所示
<a href="<%= new_account_url('$129', params[:discount]) %>" class="signup"><img src="/images/sign-up.png"></a>
在后端运行rake routes命令后,我得到了
new_account GET /signup/:plan/:discount(.:format)
accounts#new {:plan=>nil, :discount=>0}
但我不知道路线上有什么错误,它会给我一些错误
No route matches {:action=>"new", :controller=>"accounts", :discount=>nil, :format=>nil, :plan=>"$129"} missing required keys: [:discount]
答案 0 :(得分:2)
如果您有网址'/signup/:plan/:discount'
,则:plan
和:discount
都是必填密钥。您永远不能将这些键的值设为nil
。如果你有,你将永远得到你现在的错误。
由于这些值是可选的,我的建议是将它们作为查询参数发送,并在控制器内部进行检查。
尝试重新组织路线定义:
get '/signup' =>'accounts#new', as: :new_account
您还可以使用link_to
重写网址,如下所示:
<%= link_to new_account_path(plan: '$129', discount: params[:discount]), class: "signup" do %>
<img src="/images/sign-up.png" />
<% end %>
现在,您将始终使用以下网址:
/signup?plain="xx"&discount="xx"
答案 1 :(得分:1)
您的params[:discount]
缺少一个值,因此当您在路线中调用它时,它未被分配:
{:action=>"new", :controller=>"accounts", :discount=>nil, :format=>nil, :plan=>"$129"}
由于您已将:discount
作为路由的必需部分,因此在调用帮助程序时需要向其传递值。
最重要的是确保填充params[:discount]
变量。如果没有,您可能希望使用bound parameters
:
get '/signup/:plan(/:discount') =>'accounts#new', discount: 0, as: :new_account
这会使:discount
参数变得非必要。
作为第二个,您应该在创建链接时始终使用link_to
。它使您的HTML保持最新并符合规范:
<%= link_to new_account_path("$129", params[:discount]), class: "signup" do %>
<%= image_tag "sign-up.png" %>
<% end %>
-
您还需要确保在适当的资源范围内设置路线:
#config/routes.rb
resources :accounts, only: [:new], path_names: { new: "signup" } do
get ":plan(/:discount)", on: :new
end