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.
Tại sao bạn sử dụng cả thông số mạnh và attr_accessible? –
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