【问题标题】:Devise how to add a addtional field to the create User form?设计如何向创建用户表单添加附加字段?
【发布时间】:2015-03-21 08:35:14
【问题描述】:

我正在尝试在创建时向我的用户添加用户名。

在设计/注册/新我有:

<h2>Sign up</h2>

<%= form_for(resource, :as => resource_name, :url => registration_path(resource_name)) do |f| %>
  <%= devise_error_messages! %>
  <p><%= f.label :username %><br />
  <%= f.text_field :username %></p>

  <p><%= f.label :email %><br />
  <%= f.email_field :email %></p>

  <p><%= f.label :password %><br />
  <%= f.password_field :password %></p>

  <p><%= f.label :password_confirmation %><br />
  <%= f.password_field :password_confirmation %></p>

  <p><%= f.submit "Sign up" %></p>
<% end %>

<%= render :partial => "devise/shared/links" %>

问题是没有params[:username] 发送到控制器,我在视图中收到以下错误:

ActiveRecord::StatementInvalid in Devise::RegistrationsController#create

Mysql::Error: Column 'username' cannot be null:
  INSERT INTO `users` (`email`, `encrypted_password`, `reset_password_token`,
  `reset_password_sent_at`, `remember_created_at`, `sign_in_count`,
  `current_sign_in_at`, `last_sign_in_at`, `current_sign_in_ip`, `last_sign_in_ip`,
  `created_at`, `updated_at`, `username`) VALUES ('mail@test.dk',
  '$2a$10$bWjAXLY8QGXrXeVrGciv2O6mjRF940lajBEsUOPPtPDhKyj0A/gia', NULL, NULL,
  NULL, 0, NULL, NULL, NULL, NULL, '2011-05-15 16:16:36', '2011-05-15 16:16:36',
  NULL)

Rails.root: C:/Rails/densjove
Application Trace | Framework Trace | Full Trace

Request

Parameters:

{"utf8"=>"✓",
 "authenticity_token"=>"qkQ8L0ZonXYxWQ2f4cfdREZ222oa2zGUb/qll3TRxjQ=",
 "user"=>{"username"=>"hansen",
 "email"=>"mail@test.dk",
 "password"=>"[FILTERED]",
 "password_confirmation"=>"[FILTERED]"},
 "commit"=>"Sign up"}

我已将username 列添加到我的模型中,但是如何在我的控制器中访问params[:username]

【问题讨论】:

  • 为什么用户名没有提交?
  • 问题已解决我确实忘记将用户名参数添加到 attr_accessible
  • 完整答案在这里:Add custom fields to Devise user model
  • 您应该添加您的第二条评论作为答案,并将其标记为正确的。这样,该问题的未来访问者就可以知道这是正确的答案,而不必查看 cmets。

标签: ruby-on-rails ruby ruby-on-rails-3 devise


【解决方案1】:

Rails 4 将清理参数移至控制器。

为设计添加自定义字段的一种方法是在应用程序控制器中添加一个前置过滤器,调用一个方法来定义哪些是您允许的参数。

来自https://github.com/plataformatec/devise#strong-parameters的代码

class ApplicationController < ActionController::Base
  before_filter :configure_permitted_parameters, if: :devise_controller?

  protected

  def configure_permitted_parameters
    devise_parameter_sanitizer.for(:sign_up) << :username
  end
end

上面的代码是如果你添加一个名为用户名的字段。如果您要添加 first_name,它将是:

devise_parameter_sanitizer.for(:sign_up) << :first_name

这是一种方法,我强烈考虑阅读上面链接中的文档,以了解有关自定义设计以允许某些字段的更多信息。

【讨论】:

    【解决方案2】:

    将用户名字段添加到app/model/user.rb中的attr_accessible

    # Setup accessible (or protected) attributes for your model
    attr_accessible :email, :password, :password_confirmation, :remember_me, :username
    

    取自上面的评论 #1,以便其他人可以轻松查看解决方案

    【讨论】:

    • attr_accessible 在 rails4 上无效。关于应该如何在那里完成的任何想法?
    【解决方案3】:

    Rails 4 Strong Params 方式添加到控制器

    https://github.com/plataformatec/devise#strong-parameters

    【讨论】:

    • -1:链接答案不好,因为链接很容易损坏。
    • 您必须说明您使用哪些步骤才能使其正常运行!
    【解决方案4】:

    如果您希望在注册用户时添加 FirstName、LastName 或任何列,您必须使用设计允许的参数配置这些列。

    class ApplicationController < ActionController::Base
      before_action :configure_new_column_to_devise_permitted_parameters, if: :devise_controller?
    
      protected
    
      def configure_new_column_to_devise_permitted_parameters
        registration_params = [:first_name, :last_name, :email, :password, :password_confirmation]
        if params[:action] == 'create'
          devise_parameter_sanitizer.for(:sign_up) { 
            |u| u.permit(registration_params) 
          }
        elsif params[:action] == 'update'
          devise_parameter_sanitizer.for(:account_update) { 
            |u| u.permit(registration_params << :current_password)
          }
        end
      end    
    end
    

    例如:要在用户注册处再添加一列如alternate_email,只需将alternate_email 列添加到registration_params

    registration_params = [:first_name, :last_name, :email, :password, :password_confirmation, :alternate_email ]

    电子邮件]

    【讨论】:

      猜你喜欢
      • 2013-08-29
      • 1970-01-01
      • 2012-03-31
      • 1970-01-01
      • 1970-01-01
      • 2011-10-05
      • 2021-04-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多