2013-11-20 38 views
1

我在實例的觀點,即用戶還沒有證實他們的電子郵件呈現形式:[ID]。該表格還允許他們輸入他們的電子郵件偏好。得到錯誤缺少必需的鍵:上的form_tag

這裏是表格。

<%= 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 

回答

3

因爲你不需要ID PARAM這個動作搜索用戶,你應該從你的路線刪除它在routes.rb中這個動作:

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

引發的錯誤,因爲與ID路線包括預計:id參數,你不提供撥打這條路線的幫手。

2

這究竟是爲什麼?

form_tag路徑(或你的情況,URL)需要採取id(或物體)的user的要更新...喜歡的東西:

<%= form_tag update_email_and_sports_url(current_user), class: "form-signin", method: 'patch' do %>

這將解決missing required keys: [:id]的錯誤。

可能更好的主意...

但是,如果你使用current_user總是此更新,你可以考慮從你的路線下降:id ...然後你會離開form_tag在你的問題原樣。

相關問題