使用我运行生成器时添加的默认代码,Devise不会保存新的电子邮件或密码。我发现添加了第一个,中间名和姓氏字段然后重新开始。默认代码为:
<%= form_for(resource, as: resource_name, url: registration_path(resource_name), html: { method: :put }) do |f| %>
我在registrations/edit
表单中添加了几个字段,具体为:first_name,:middle_name和:last_name
根据Stackoverflow上的其他示例,我更改了views/users/registrations/edit.html.erb
文件中的资源名称和路径。:
<%= form_for(@user, as: :update, url: users_path(params[:id]), html: { method: :put, :multipart => true }) do |f| %>
Devise位于我的config/routes
文件的顶部,其范围为:
devise_for :users
devise_scope :user do
put "update", to: 'devise/registrations#update', as: :update
end
在ApplicationController中,我清理了params - 注册所需的那些以及我添加的那些:
protected
def configure_permitted_parameters
devise_parameter_sanitizer.for(:users) { |u| u.params.permit(:id,
:email, :password, :password_confirmation)}
devise_parameter_sanitizer.for(:users) { |u| u.permit(
:first_name, :middle_name, :last_name) }
end
end
我还将惯用的before_filter放在ApplicationController的顶部:
before_action :configure_permitted_parameters, if: :devise_controller?
以下是更新方法:
def update
@user = User.find(params[:id])
if params[:user][:password].blank?
params[:user].delete(:password)
params[:user].delete(:password_confirmation)
end
if @user.update_attributes(users_params)
sign_in(current_user, :bypass => true) if @user == current_user
@user.save
flash[:success] = "Profile Updated!"
redirect_to user_path
else
redirect_to edit_user_path
end
end
这是rails服务器输出。 (我用了#34;我最好的朋友&#34;代表名字,中间名和姓。):
Started GET "/users/edit?update%5Bname%5D=User+Example&update%5Bfirst_name%5D=my&update%5Bmiddle_name%5D=best&update%5Blast_name%5D=friend&commit=Update" for ::1 at 2015-01-28 18:54:57 -0600<br/>
由Devise处理:: RegistrationsController#编辑为HTML
参数:{&#34;更新&#34; =&gt; {&#34;名称&#34; =&gt;&#34;用户示例&#34;,&#34; first_name&#34; =&gt;&#34 ;我的&#34;,&#34; middle_name&#34; =&gt;&#34;最佳&#34;,&#34; last_name&#34; =&gt;&#34;朋友&#34;},&#34 ;提交&#34; = GT;&#34;更新&#34;}
用户负载(0.6ms)SELECT&#34;用户&#34;。* FROM&#34;用户&#34;用户&#34;。&#34; id&#34; = $ 1 ORDER BY&#34;用户&#34;。&#34; id&#34; ASC LIMIT 1 [[&#34; id&#34;,1]]
在布局/应用程序(6.1ms)内呈现用户/注册/ edit.html.erb
渲染shared / _bootstrap.html.erb(0.1ms)
渲染共享/ _html5_shim.html.erb(0.0ms)
渲染布局/ _navigation_top.html.erb(1.1ms)
渲染布局/ _messages.html.erb(0.1ms)
渲染共享/ _navigation_bottom.html.erb(0.5ms)
渲染shared / _jquery_and_js.html.erb(0.1ms)
在472ms完成200 OK(浏览次数:468.8ms | ActiveRecord:0.6ms)
在rails控制台中查看用户会将第一个,中间名和姓氏的值显示为&#39; nil&#39;。此外,尝试更改电子邮件或密码不起作用。新用户可以注册并保存他们的电子邮件和密码。
我很困惑为什么在安装设计之后这不起作用。也就是说,如何修复它以便用户可以更改他们的电子邮件,密码或添加他们的名字,中间名和姓氏?提前谢谢。
答案 0 :(得分:0)
不知道这里发生的其他事情(你有很多自定义),但在我看来第一件事是错的:
您允许:用户作为params的根目录:devise_parameter_sanitizer.for(:users) { |u| u.params.permit(:id, :email, :password, :password_confirmation)}
但是使用:update(???)作为param hash的根来创建一个表单:
<%= form_for(@user, as: :update, url: users_path(params[:id]), html: { method: :put, :multipart => true }) do |f| %>
首先将表单更改为<%= form_for(@user, as: :user, url: users_path(params[:id]), html: { method: :put, :multipart => true }) do |f| %>
答案 1 :(得分:0)
我无意中 - 前一段时间 - 删除了_form.html.erb
部分设置在views / users文件夹中的部分。然后我还删除了从users/edit.html.erb
文件到部分的链接。为了弄清楚这一点,我不得不建立一个新项目。这不是路由错误。