Account#plans中的ActionController :: UrlGenerationError

时间:2015-11-01 07:14:29

标签: ruby-on-rails ruby-on-rails-4 routes

这是我在路线档案中的路线

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]

2 个答案:

答案 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