2017-07-28 102 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没有任何价值。

它会解决你的问题。

相关问题