5

Tôi mới sử dụng môi trường Ruby on Rails và hầu hết các vấn đề tôi có thể giải quyết, nhưng tôi không thể tìm thấy giải pháp cho vấn đề này được nêu ra.Rails 4 & Devise - Tên người dùng không được thêm vào cơ sở dữ liệu khi người dùng mới tạo

Để cung cấp bối cảnh:

  • Sử dụng đường ray (4.0.0)
  • Sử dụng cai ngục (1.2.3)
  • Sử dụng đưa ra (3.0.0)
  • Sử dụng rolify (3.2 .0)
  • Sử dụng cancan (1.6.10)

Vấn đề của tôi

Khi tôi đăng ký một người dùng mới với Đăng ký của Devise. Trường: name không được thêm vào cơ sở dữ liệu. Xem ra máy chủ

mô hình tài (ứng dụng/mô hình/user.rb)

: Tên được bao gồm trong 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 

tài điều khiển (app/controllers/users_controller.rb).

Tôi đã thêm danh sách trắng tham số để giữ với Rails 4, nhưng điều này không giải quyết được vấn đề.

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 

lập mưu của quan điểm đăng ký mới (app/views/đưa ra/đăng ký/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" %> 

ứng dụng điều khiển (app/controllers/application_controller.rb)

Tôi đã làm theo các hướng dẫn liên quan đến thông số mạnh và đã bao gồm cách tiếp cận của người lười biếng từ 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 

Đầu ra máy chủ khi tạo người dùng mới.

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"=>"[email protected]", "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" = '[email protected]' 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", "[email protected]"], ["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) 

Kết luận của tôi

Sau khi tất cả điều này tôi tin rằng vấn đề nằm ở registration_controller lập mưu, nhưng tôi không chắc chắn chính xác làm thế nào để đi về việc truy cập bộ điều khiển và chấn chỉnh này, hoặc nếu đây là nơi mà vấn đề thực sự là. Tôi hy vọng nó là một cái gì đó đơn giản và tôi đã bỏ qua nó.

Nếu có ai đó gặp phải vấn đề này hoặc có thể tỏa sáng một chút về tình hình, nó sẽ được đánh giá cao.

Chúc mừng.

+1

Tại sao bạn sử dụng cả thông số mạnh và attr_accessible? –

+0

Tôi đã sử dụng trình tạo starterapp để tạo ứng dụng cơ bản, nó bao gồm các dòng attr_accessible và mới làm quen với đường ray, tôi không biết gì tốt hơn cho đến bây giờ - đã học về các thông số mạnh thông qua vấn đề này. – 7sunami

Trả lời

10

Rails 4 sử dụng thông số mạnh.

Bạn phải cho phép các thông số mà bạn muốn chuyển qua bộ điều khiển để lập mô hình. nói cách khác liên kết trực tiếp đến các thuộc tính trong mô hình thông qua các tham số bây giờ không được phép bạn phải xác định nếu bất kỳ giá trị tham số nào được giả định để truyền qua bộ điều khiển đến mô hình.

Bạn có thể tìm thấy một số giúp đỡ trên blog này: http://edgeapi.rubyonrails.org/classes/ActionController/StrongParameters.html

hoặc như nếu chúng ta xem xét vấn đề của bạn bạn có thể ghi đè lên SessionsController cho devise hoặc sử dụng sự giúp đỡ

devise_parameter_sanitizer(:sign_up) 

hơn có thể được tìm thấy ở đây: https://github.com/plataformatec/devise#strong-parameters

2

Giả sử bạn đang sử dụng gói, bạn có thể truy cập vào viên ngọc devise nhìn vào mã theo:

bundle open devise 

NẾU bạn cần phải ghi đè bộ điều khiển devise tiêu chuẩn, bạn có thể làm như vậy bằng cách sao chép bộ điều khiển từ gem vào controller/devise/[tên file] trong ứng dụng của bạn và nó sẽ được ưu tiên. Lưu ý rằng nếu bạn làm điều này, bạn sẽ phải cẩn thận với nâng cấp đá quý.

theo nhận xét trước đây, tại sao bạn trộn danh sách trắng với thông số mạnh; bạn chỉ nên cần thông số mạnh mẽ trong đường ray 4 và đưa ra 3

+0

Cảm ơn thông tin chi tiết. Tôi đã có một cái nhìn nhưng tôi không muốn thực hiện một ghi đè hoàn chỉnh, như bạn nói, nó có thể có vấn đề khi nâng cấp đá quý. – 7sunami

0

tôi thấy vấn đề trong application_controller:

devise_parameter_sanitizer.for(:sign_in) ... 

cần phải được

devise_parameter_sanitizer.for(:sign_up)... 

giám sát nhẹ thay cho tôi, cảm ơn cho giúp đỡ.

8

Thêm

before_action :configure_permitted_parameters, if: :devise_controller? 

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

để application_controller tôi làm việc cho tôi

CẬP NHẬT

before_action :configure_permitted_parameters, if: :devise_controller? 

def configure_permitted_parameters 
    devise_parameter_sanitizer.permit(:sign_in, keys: [:name, :email]) 
    devise_parameter_sanitizer.permit(:sign_up, keys: [:name, :email, :password, :password_confirmation]) 
    devise_parameter_sanitizer.permit(:account_update, keys: [:name, :email, :password, :password_confirmation, :current_password]) 
end 

Dường như devise cập nhật tài liệu của họ và họ muốn nó thiết lập như trên.

+0

: email: mật khẩu phải là: email,: mật khẩu –

+0

Cảm ơn @RichardGrossman, đã được sửa. – codermyles