ruby-on-rails - Rails 4 & Devise - 创建新用户时,用户名不会添加到数据库中

标签 ruby-on-rails authentication devise ruby-on-rails-4 strong-parameters

我是 Ruby on Rails 环境的新手,我已经能够解决大多数问题,但我还没有找到解决这个问题的方法。

提供上下文:

  • 使用 rails (4.0.0)
  • 使用典狱长 (1.2.3)
  • 使用设计 (3.0.0)
  • 使用 rolify (3.2.0)
  • 使用 cancan (1.6.10)

  • 我的问题

    当我使用 注册新用户时设计的 登记。 :name 字段没有被添加到数据库中。查看服务器输出

    用户模型 (应用程序/模型/用户.rb)

    :name 包含在 attr_accessible 中。
    class User < ActiveRecord::Base
      rolify
      # Include default devise modules. Others available are:
      # :token_authenticatable, :confirmable,
      # :lockable, :timeoutable and :omniauthable
      devise :database_authenticatable, :registerable,
             :recoverable, :rememberable, :trackable, :validatable
    
      # Setup accessible (or protected) attributes for your model
      attr_accessible :role_ids, :as => :admin
      attr_accessible :name, :email, :password, :password_confirmation, :remember_me
    
    end
    

    用户 Controller (应用程序/ Controller /users_controller.rb)。

    为了与 Rails 4 保持一致,我添加了 params 白名单,但这并没有解决问题。
    class UsersController < ApplicationController
      before_filter :authenticate_user!
    
      def index
        authorize! :index, @user, :message => 'Not authorized as an administrator.'
        @users = User.all
      end
    
      def show
        @user = User.find(params[:id])
      end
    
      def update
        authorize! :update, @user, :message => 'Not authorized as an administrator.'
        @user = User.find(params[:id])
        if @user.update_attributes(params[:user], :as => :admin)
          redirect_to users_path, :notice => "User updated."
        else
          redirect_to users_path, :alert => "Unable to update user."
        end
      end
    
      def destroy
        authorize! :destroy, @user, :message => 'Not authorized as an administrator.'
        user = User.find(params[:id])
        unless user == current_user
          user.destroy
          redirect_to users_path, :notice => "User deleted."
        else
          redirect_to users_path, :notice => "Can't delete yourself."
        end
      end
    
      private
        # Use callbacks to share common setup or constraints between actions.
        def set_user
          @user = User.find(params[:id])
        end
    
        # Never trust parameters from the scary internet, only allow the white list through.
        def user_params
          params.require(:user).permit(:name, :email, :password, :password_confirmation, :remember_me)
        end
    end
    

    Devise 的新注册 View (app/views/devise/registrations/new.html.erb)
    <h2>Sign up</h2>
    <%= simple_form_for(resource, :as => resource_name, :url => registration_path(resource_name), :html => {:class => 'form-vertical' }) do |f| %>
      <%= f.error_notification %>
      <%= display_base_errors resource %>
      <%= f.input :name, :autofocus => true %>
      <%= f.input :email, :required => true %>
      <%= f.input :password, :required => true %>
      <%= f.input :password_confirmation, :required => true %>
      <%= f.button :submit, 'Sign up', :class => 'btn-primary' %>
    <% end %>
    <%= render "devise/shared/links" %>
    

    应用 Controller (应用程序/ Controller /application_controller.rb)

    我遵循了关于强参数的说明,并包含了来自 Devise 的懒人方法。
    class ApplicationController < ActionController::Base
      # Prevent CSRF attacks by raising an exception.
      # For APIs, you may want to use :null_session instead.
      protect_from_forgery with: :exception
      before_filter :configure_permitted_parameters, if: :devise_controller?
    
      rescue_from CanCan::AccessDenied do |exception|
        redirect_to root_path, :alert => exception.message
      end
    
      protected
    
      def configure_permitted_parameters
        devise_parameter_sanitizer.for(:sign_in) { |u| u.permit(:name, :email) }
      end
    end
    

    创建新用户时的服务器输出。
    Started POST "/users" for 127.0.0.1 at 2013-07-16 15:31:20 +1000
    Processing by Devise::RegistrationsController#create as HTML
      Parameters: {"utf8"=>"✓", "authenticity_token"=>"TYp9xOgtdKJI62rUddU7EE1C7FDF5qnmWgGENluzaWk=", "user"=>{"name"=>"John Smith", "email"=>"john.smith@example.com", "password"=>"[FILTERED]", "password_confirmation"=>"[FILTERED]"}, "commit"=>"Sign up"}
    Unpermitted parameters: name
       (0.1ms)  begin transaction
      User Exists (0.1ms)  SELECT 1 AS one FROM "users" WHERE "users"."email" = 'john.smith@example.com' LIMIT 1
    Binary data inserted for `string` type on column `encrypted_password`
      SQL (0.3ms)  INSERT INTO "users" ("created_at", "email", "encrypted_password", "updated_at") VALUES (?, ?, ?, ?)  [["created_at", Tue, 16 Jul 2013 05:31:20 UTC +00:00], ["email", "john.smith@example.com"], ["encrypted_password", "$2a$10$kMfZLiBm6md0zoWXd0esjO/IRHBC72444ABDKcXVhPa6mCco9pIJu"], ["updated_at", Tue, 16 Jul 2013 05:31:20 UTC +00:00]]
       (17.0ms)  commit transaction
       (0.1ms)  begin transaction
    Binary data inserted for `string` type on column `last_sign_in_ip`
    Binary data inserted for `string` type on column `current_sign_in_ip`
      SQL (0.4ms)  UPDATE "users" SET "last_sign_in_at" = ?, "current_sign_in_at" = ?, "last_sign_in_ip" = ?, "current_sign_in_ip" = ?, "sign_in_count" = ?, "updated_at" = ? WHERE "users"."id" = 3  [["last_sign_in_at", Tue, 16 Jul 2013 05:31:20 UTC +00:00], ["current_sign_in_at", Tue, 16 Jul 2013 05:31:20 UTC +00:00], ["last_sign_in_ip", "127.0.0.1"], ["current_sign_in_ip", "127.0.0.1"], ["sign_in_count", 1], ["updated_at", Tue, 16 Jul 2013 05:31:20 UTC +00:00]]
       (1.1ms)  commit transaction
    Redirected to http://0.0.0.0:3000/
    Completed 302 Found in 94ms (ActiveRecord: 19.0ms)
    

    我的结论

    毕竟这一切我相信问题出在 设计的 注册 Controller ,但我不确定如何访问 Controller 并纠正这个问题,或者这是否是问题的实际所在。我希望它很简单,而我只是忽略了它。

    如果有人遇到过这个问题或者可以对这种情况有所了解,我们将不胜感激。

    干杯。

    最佳答案

    Rails 4 使用强参数。

    您必须允许要通过 Controller 传递给模型的参数。
    换句话说,现在不允许通过 params 直接关联到模型中的属性,您必须指定是否假设任何参数值通过 Controller 传递到模型。

    您可能会在此博客上找到一些帮助:
    http://edgeapi.rubyonrails.org/classes/ActionController/StrongParameters.html

    或者就好像我们考虑您的问题一样,您可以覆盖 SessionsController 以进行设计或使用

    devise_parameter_sanitizer(:sign_up)
    

    更多帮助可以在这里找到:https://github.com/plataformatec/devise#strong-parameters

    关于ruby-on-rails - Rails 4 & Devise - 创建新用户时,用户名不会添加到数据库中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17669051/

    相关文章:

    ruby-on-rails - Factory Girl 有很多关系(和 protected 属性)

    ruby-on-rails - Rails 不使用 Postgres 用户帐户

    ruby-on-rails - 如何更改 Rails 日期助手选择框的顺序?

    php - 为什么注册后数据库没有返回用户的数据?

    python - 是否有任何内置的 django 身份验证和 acl=访问控制列表库?

    javascript - Angularjs 身份验证维护

    twitter-bootstrap - 客户端验证不适用于简单的设计表单

    ruby-on-rails - ruby on rails 服务器不会开始丢失设计文件

    ruby-on-rails - 使用 Rspec、Devise 和 Factory Girl 测试用户模型

    ruby-on-rails - Rails 设计有 gmail 错误