获取错误缺少所需的键:form_tag上的[:id]

时间:2013-11-20 15:42:37

标签: ruby-on-rails ruby

我在用户尚未验证其电子邮件的实例中的视图中呈现表单。此表单还允许他们输入他们的电子邮件首选项。

这是表格。

<%= form_tag update_email_and_sports_url, class: "form-signin", method: 'patch' do %>
  <h2>Please confirm your email</h2>
    <%= email_field_tag :email, nil, class: "input-block-level", placeholder: current_user.email %>
  <h2>We'll email you when opportunities arise to play any of the sports you select below:</h2>
    <%= check_box_tag :basketball, checked = false %>
    <%= check_box_tag :volleyball, checked = false %>
    <%= check_box_tag :soccer, checked = false %>
    <%= check_box_tag :football, checked = false %>
    <%= check_box_tag :hockey, checked = false %>
    <%= check_box_tag :kickball, checked = false %>
    <%= check_box_tag :softball, checked = false %>
    <%= f.hidden_field_tag :user_id, :value => current_user.id %>
<div>
  <%= submit_tag "Submit", class:"btn btn-large btn-success" %>
</div>   
  

视图甚至不会渲染,我收到此错误:

No route matches {:controller=>"users", :action=>"update_preferences"} missing required keys: [:id]

它说错误在我的form_tag行中。这是我的路线。

patch '/user/preferences/:id' => 'users#update_preferences', :as => 'update_email_and_sports'

我的控制器

  def update_preferences
    current_user.email = params[:email]
    preference = Preference.new(preference_params)
    redirect_to root_url
  end

  def preference_params
    params.require(:preference).permit(:user_id, :basketball, :football, :softball, :soccer, :kickball, :volleyball, :hockey)
  end

2 个答案:

答案 0 :(得分:3)

由于您不需要id param来搜索此操作中的用户,因此您应该从routes.rb中的此操作的路由中删除它:

patch '/user/preferences' => 'users#update_preferences', :as => 'update_email_and_sports'

引发错误是因为包含id的路由需要:id参数,您不提供调用此路由的帮助程序。

答案 1 :(得分:2)

为什么会这样?

form_tag路径(或者在您的情况下,网址)需要获取您要更新的id的{​​{1}}(或对象)...类似于:< / p>

user

这将解决<%= form_tag update_email_and_sports_url(current_user), class: "form-signin", method: 'patch' do %>的错误。

可能有更好的想法......

但是,如果您始终使用missing required keys: [:id]进行此次更新,则可以考虑从您的路线中删除current_user ...然后您将问题中的:id保留为-is。