我已经创建了一个使用devise的简单Rails应用。对于登录和注销,我使用具有电子邮件和密码的标准USER模型。我有一个PROFILE模型来存储用户的所有其他详细信息。
我想创建一个页面,用户可以在其中更新所有详细信息。当前出现以下错误...
UsersController#update中的NoMethodError
nil:NilClass的未定义方法“名称”
Screenshot of entire error message
我的模特看起来很……
class User < ApplicationRecord
Include default devise modules. Others available are:
:confirmable, :lockable, :timeoutable, :trackable and :omniauthable
devise :database_authenticatable, :registerable, :recoverable, :rememberable, :validatable
has_one :profile
after_create :create_profile
attr_accessor :first_name, :last_name, :description
accepts_nested_attributes_for :profile
end
class Profile < ApplicationRecord
belongs_to :user
end
查看页面代码看起来像...
<h1>Account Details</h1>
<p><strong>Email:</strong> <%= @user.email %></p>
<p><strong>First Name:</strong> <%= @user.profile.first_name %></p>
<p><strong>Last Name:</strong> <%= @user.profile.last_name %></p>
<%= form_for(@user, :as => :user) do |field| %>
<p>
<%= field.label :email %>
<%= field.text_field :email %>
</p>
<%= fields_for @user.profile do |profile| %>
<p>
<%= profile.label :first_name %><br>
<%= profile.text_field :first_name %>
<% end %>
</p>
<p>
<%= field.submit "Update" %>
</p>
<% end %>
控制器看起来像
Class UsersController < Devise::RegistrationsController
def new
build_resource({})
resource.build_profile
respond_with self.resource
end
def create
super
end
def edit
super
end
def update
@user = current_user
end
def show
@user = current_user
end
before_action :configure_permitted_parameters, if: :devise_controller?
protected
def configure_permitted_parameters
devise_parameter_sanitizer.permit(:sign_up) { |u|
u.permit(:email, :password, [profile_attributes: [ :first_name, :last_name]])
}
end
end
我无法获得此表格来渲染和更新模型。我希望有人能告诉我我在做什么错。
答案 0 :(得分:1)
尝试一下:
configure_permitted_parameters
和相应的
before_action
至ApplicationController
u.permit(:email, :password, profile_attributes: [:id, :first_name, :last_name])
答案 1 :(得分:0)
删除UsersController和
在application_controller中
class ApplicationController<ActionController::Base
protect_from_forgery with::exception
before_action:configure_permitted_parameters,if::devise_controller?
def check_is_admin
if current_user.is_admin
return true
else
redirect_to roots_path,notice:"page looking for sign_in"
end
end
private
def after_sign_out_path_for(resource_or_scope)
new_user_session_path
end
def after_sign_in_path_for(resource_or_scope)
root_path
end
protected
def configure_permitted_parameters
devise_parameter_sanitizer.permit(:sign_up,keys:[:first_name, :last_name])
devise_parameter_sanitizer.permit(:account_update,keys:[:first_name, :last_name])
end
end
您可以根据自己的用途更改路径。...