2017-07-28 98 views
0

我已經添加了gem「devise」 。我不明白我的代碼有什麼問題。提前致謝!沒有路線匹配{:action =>「change_name」,:controller =>「users」,:id => nil}缺少必需的鍵:[:id]

錯誤:

def user_form 
    common_options = { validate: true, html: { class: 'user-form' } } 
    form_options = current_user ? [ current_user, { url: change_user_name_path(current_user.id), method: :post, validate: true }.merge(common_options) ] : [ User.new, { validate: true }.merge(common_options) ] 
    form_for *form_options do |f| 
     yield f 
    end 
    end 

路線

Rails.application.routes.draw do 

    devise_for :users 
    devise_for :usernames 
    root 'surveys#index' 
    resources 'surveys' 
    resources 'attempts' 
    resources 'users', only: [:create] 

    delete 'attempts/:survey_id/:user_id' => 'attempts#delete_user_attempts', as: :delete_user_attempts 

    post 'user/:id/change_name' => 'users#change_name', as: :change_user_name 

控制器:

class UsersController < ApplicationController 
    def create 
    session[:user_id] = User.create(user_params).id 
    redirect_to :back 
    end 

    def change_name 
    @user = User.find(params[:id]) 
    @user.update(user_params) 
    redirect_to :back 
    end 

    def user_params 
    params.require(:user).permit(:name) 
    end 
end 

有人能幫助這問題?

+0

你什麼時候得到這個錯誤?你打過什麼網址?你可能調用了change_name動作而沒有通過ID – Sajin

+0

@Sajin'form_options = current_user? [current_user,{url:change_user_name_path(current_user.id),method :: post,validate:true} .merge(common_options)]' –

+0

您需要傳遞'current_user'而不是'current_user.id'。你有當前用戶的數據嗎? – Vishal

回答

0

嘗試從模型中刪除方法current_user。因爲current_user是設計返回當前登錄用戶的默認方法。你正在壓倒設計的方法。這就是爲什麼你得到nil ID的錯誤,因爲你的current_user沒有任何價值。

它會解決你的問題。

相關問題