我尝试通过输入他们的电子邮件地址和密码(Rails应用程序/设计身份验证)来构建一个用户可以注册的网站,一旦完成,他们就可以提供其他详细信息,例如&# 34;关于我"田地,出生日期等。
我正在关注Stack溢出的帖子,这似乎是在问同样的问题:SO question
我按照该答案中提供的步骤操作,但我的字段未保存到数据库中。
以下是我的个人资料#show page:
中的相关代码<%= form_for @user, url: updateprofile_path, html: { method: :put, :multipart => true } do |f| %>
<%= f.text_area :about, class: "form-control", rows: "10", placeholder: "Tell us about yourself." %>
<div><%= f.submit "Update", :class => "btn btn-default btn-xs" %></div>
<% end %>
updateprofile 路径来自路线文件中的自定义路线:
devise_for :users, :controllers => { :registrations => "registrations" }
devise_scope :user do
get 'register', to: 'devise/registrations#new', as: :register
get 'signin', to: 'devise/sessions#new', as: :signin
get 'logout', to: 'devise/sessions#destroy', as: :logout
get 'edit', to: 'devise/registrations#edit', as: :edit
put "update" => 'devise/registrations#update', as: :updateprofile
end
这是我的注册控制器:
class RegistrationsController < Devise::RegistrationsController
def edit
@user = User.find(params[:id])
end
def update
@user = User.find(current_user.id)
successfully_updated = if needs_password?(@user, params)
@user.update_with_password(devise_parameter_sanitizer.sanitize(:account_update))
else
# remove the virtual current_password attribute
# update_without_password doesn't know how to ignore it
params[:user].delete(:current_password)
@user.update_without_password(devise_parameter_sanitizer.sanitize(:account_update))
end
if successfully_updated
set_flash_message :notice, :updated
# Sign in the user bypassing validation in case their password changed
sign_in @user, :bypass => true
redirect_to profiles_show_path(@user)
else
render "edit"
end
end
private
# check if we need password to update user data
# ie if password or email was changed
# extend this as needed
def needs_password?(user, params)
user.email != params[:user][:email] ||
params[:user][:password].present? ||
params[:user][:password_confirmation].present?
end
def sign_up_params
params.require(:user).permit(:first_name, :last_name, :email, :password, :password_confirmation)
end
def account_update_params
params.require(:user).permit(:email, :password, :date_of_birth, :about, :avatar, :password_confirmation, :current_password)
end
end
注册控制器中的更新方法我从关于此主题的设计文档中获得:Link
由于这还没有奏效,我怀疑这是否是我需要做的事情。所有这一切的结果是我在输入about字段后点击Submit,它会将它路由到/ update路径,这是一个空白模板(我刚创建它以覆盖丢失的模板错误)。我在rails控制台中运行User.all并确认about字段仍然为null。
谁能看到我哪里出错了?我花了很多时间试图解决这个问题并希望得到任何帮助。
谢谢,
答案 0 :(得分:2)
我不会惹恼任何设计控制器。你想做的事情可以这样实现:
1)只需将您想要的字段添加到用户模型(about_me,date_of_birth).....然后修改您的应用程序控制器,如下所示:
class ApplicationController < ActionController::Base
protect_from_forgery with: :exception
before_action :configure_permitted_parameters, if: :devise_controller?
protected
def configure_permitted_parameters
devise_parameter_sanitizer.for(:sign_up) << :about_me, :date_of_birth
devise_parameter_sanitizer.for(:account_update) << :about_me, :date_of_birth
end
end
完成此操作后,您可以根据需要将字段添加到注册页面。否则,您只需在表单中添加设计/注册/ edit.html.erb
为人们提供指向其编辑注册路径的链接后,他们就可以添加其他信息并更新其个人资料。
答案 1 :(得分:0)
默认情况下,设计视图使用resource和resource_name等方法。如果按照上面的建议创建一个新的Registrations控制器,以便与Devise生成的默认视图一起使用,您可能会发现在RegistrationsHelper中重新定义这些方法很有帮助:
module RegistrationsHelper
def resource_name
:user
end
def resource
@resource ||= User.new
end
def devise_mapping
@devise_mapping ||= Devise.mappings[:user]
end
end
我是从Devise wiki Custom Registration Controller
中读到的希望它能帮到你