在设计/注册之外的不同页面上创建form_for @user

时间:2014-11-27 23:23:17

标签: ruby-on-rails devise form-for

我尝试通过输入他们的电子邮件地址和密码(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。

谁能看到我哪里出错了?我花了很多时间试图解决这个问题并希望得到任何帮助。

谢谢,

2 个答案:

答案 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

中读到的

希望它能帮到你