Ruby on rails 在rails 4中设计用户模型中保存自定义字段

Ruby on rails 在rails 4中设计用户模型中保存自定义字段,ruby-on-rails,ruby,authentication,devise,ruby-on-rails-4,Ruby On Rails,Ruby,Authentication,Devise,Ruby On Rails 4,我制作了一个Desive用户模型,并在其中添加了其他字段。当我创建和帐户时,一切正常,只有电子邮件、pw和pw conf 然后我想允许用户进入编辑页面并填写可选的附加字段。 但是,当他们提交时,所有内容都保存为零 class RegistrationsController < Devise::RegistrationsController before_action :configure_permitted_parameters, if: :devise_controller?

我制作了一个Desive用户模型,并在其中添加了其他字段。当我创建和帐户时,一切正常,只有电子邮件、pw和pw conf

然后我想允许用户进入编辑页面并填写可选的附加字段。 但是,当他们提交时,所有内容都保存为零

 class RegistrationsController < Devise::RegistrationsController

   before_action :configure_permitted_parameters, if: :devise_controller?

   def configure_permitted_parameters
     devise_parameter_sanitizer.for(:sign_in){ |u| u.permit(:email, :password) }
     devise_parameter_sanitizer.for(:sign_up){ |u| u.permit(:name, :username, :about,  :email, :password, :password_confirmation)}
     devise_parameter_sanitizer.for(:account_update){ |u| u.permit(:name, :username, :about, :email, :password, :password_confirmation) }
   end

   def update
     self.resource = resource_class.to_adapter.get!(send(:"current_#{resource_name}").to_key)
     if resource.update_with_password(user_params)
       if is_navigational_format?
         flash_key = update_needs_confirmation?(resource, prev_unconfirmed_email) ? :update_needs_confirmation : :updated
         set_flash_message :notice, flash_key
       end
       sign_in resource_name, resource, :bypass => true
       respond_with resource, :location => after_update_path_for(resource)
     else
       clean_up_passwords resource
       respond_with resource
     end
   end

   def user_params 
     params.require(:user).permit(:email, :password, :current_password, :password_confirmation, :name, :username, :about) 
   end
 end
但是,当我签入控制台(使用User.last)时,数据库中没有保存任何内容。我被卡住了,看了看,不知道出了什么问题…

首先生产新的领域。 供参考

是否已在用户控制器参数中添加新字段

   def user_params
      params.require(:user).permit(:email, :password, :password_confirmation)
    end

    def sign_up_params
      params.require(:user).permit(:email, :password, :password_confirmation)
    end
在应用程序控制器中

before_filter :configure_permitted_parameters, if: :devise_controller?

  protected

  def configure_permitted_parameters
    devise_parameter_sanitizer.for(:sign_up) { |u| u.permit(:email, :password, :password_confirmation)}

    devise_parameter_sanitizer.for(:sign_in) { |u| u.permit(:email, :password, :password_confirmation)}
  end
在您的登记表中添加此项

class Users::RegistrationsController < Devise::RegistrationsController
     skip_before_filter :verify_authenticity_token, :only => [:ipn_notification]
  def sign_up_params
      params.require(:user).permit(:email, :password, :password_confirmation)
  end
类用户::注册控制器<设计::注册控制器
在筛选器之前跳过\u:验证\u真实性\u令牌,:only=>[:ipn\u通知]
def注册参数
参数要求(:用户)。允许(:电子邮件,:密码,:密码确认)
结束

之后,在所有视图中添加新字段,包括表单、显示、编辑、索引。

在Rails4中,我们有强大的参数,请

将以下行添加到应用程序\u controller.rb

before_filter :configure_devise_params, if: :devise_controller?
  def configure_devise_params
    devise_parameter_sanitizer.for(:sign_up) do |u|
      u.permit(:first_name, :last_name, :gender, :email, :password, :password_confirmation)
    end
  end

在做了类似的工作之后,我决定使用应用程序控制器,然后发现Desive文档在其强参数部分对此非常简单,并提供了使用应用程序控制器的替代方案

下面是为我工作的应用程序控制器的方法

    class ApplicationController < ActionController::Base

      before_filter :configure_permitted_parameters, if: :devise_controller?

      private

      def configure_permitted_parameters
         devise_parameter_sanitizer.for(:sign_up){ |u| u.permit(:name, :username, :about,  :email, :password, :password_confirmation)}        
         devise_parameter_sanitizer.for(:account_update){ |u| u.permit(:name, :username, :about, :email, :password, :password_confirmation) }          
      end

    end

在Rails 4.2中,我就是这样做的。 我有一个应用Desive的用户模型
使用此命令“rails生成设备:控制器用户”生成自定义控制器。
我已将“用户名”名称属性添加到我的用户模型中

在我的控制器中

class Users::RegistrationsController < Devise::RegistrationsController
 before_filter :configure_sign_up_params, only: [:create]
 before_filter :configure_account_update_params, only: [:update]
 #rest of code as generated

   protected

    # If you have extra params to permit, append them to the sanitizer.
    def configure_sign_up_params
      devise_parameter_sanitizer.for(:sign_up) << :username
    end

   # If you have extra params to permit, append them to the sanitizer.
   def configure_account_update_params
     devise_parameter_sanitizer.for(:account_update) << :username
   end

这是正确的答案。对于那些新设计的用户来说,知道您必须为其他操作清理相同的参数可能会有所帮助,例如:edit(如果用户可以编辑)。当然,您还需要编写一个rails迁移来将这些字段添加到Desive模型中,并为登录和注册屏幕生成视图(有关如何生成视图的信息,请参阅Desive docs)。我还必须使用Desive_参数_sanitizer.for(:account_update){…}要让我的用户编辑工作,我必须在
:account\u update
中添加
:current\u password
,因为任何人的应用程序都需要用户名密码来更新信息注意,对于Desive 4
    class Users::RegistrationsController < Devise::RegistrationsController

      private

      def configure_sign_up_params
        devise_parameter_sanitizer.for(:sign_up){ |u| u.permit(:name, :username, :about,  :email, :password, :password_confirmation)}
      end

      def configure_account_update_params
        devise_parameter_sanitizer.for(:account_update){ |u| u.permit(:name, :username, :about, :email, :password, :password_confirmation) }
      end

    end
class Users::RegistrationsController < Devise::RegistrationsController
 before_filter :configure_sign_up_params, only: [:create]
 before_filter :configure_account_update_params, only: [:update]
 #rest of code as generated

   protected

    # If you have extra params to permit, append them to the sanitizer.
    def configure_sign_up_params
      devise_parameter_sanitizer.for(:sign_up) << :username
    end

   # If you have extra params to permit, append them to the sanitizer.
   def configure_account_update_params
     devise_parameter_sanitizer.for(:account_update) << :username
   end
devise_for :users, controllers: {registrations: "users/registrations"}