Rails 4 & Devise-имя пользователя не добавляется в базу данных при создании нового пользователя
Я новичок в среде Ruby on Rails и большинство проблем, которые мне удалось решить, но я еще не смог найти решение этой проблемы.
Чтобы обеспечить контекст:
- Использование rails (4.0.0)
- Использование warden (1.2.3)
- используя devise (3.0.0)
- Использование rolify (3.2.0)
- Использование канкана (1.6.10)
Моя Проблема
Когда я регистрирую нового пользователя с регистрациейDevise . Имя поле не добавляется в базу данных. см. вывод сервера
Модель пользователя (приложение / модели / пользователь.rb)
: имя включено в 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
Пользовательский контроллер (app / controllers / users_controller.рубидий).
Я добавил белый список params, чтобы сохранить Rails 4, но это не решило проблему.
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 (приложение/просмотров/разработать/регистраций/новые.формат 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" %>
Контроллер приложений (app / controllers / 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)
Мой Вывод
После всего этого я считаю, что проблема заключается вDevise registration_controller, но я не совсем уверен, как получить доступ к контроллеру и исправить это, или если это действительно проблема. Я надеюсь, что это что-то простое, и я просто упустил это из виду.
Если кто-то столкнулся с этой проблемой или может пролить свет на ситуацию, это будет очень ценно.Ура.
4 ответа:
Rails 4 использует сильные параметры.
Вы должны разрешить параметры, которые вы хотите передать через контроллер в модель. другими словами, прямая связь с атрибутами в модели через params теперь не допускается, вы должны указать, должно ли какое-либо значение параметра проходить через контроллер в модель.
Вы можете найти некоторую помощь на этом блоге: http://edgeapi.rubyonrails.org/classes/ActionController/StrongParameters.html
Или как если бы мы рассматривали ваш проблема вы можете либо переопределить SessionsController для devise, либо использовать
Дополнительную помощь можно найти здесь: https://github.com/plataformatec/devise#strong-parametersdevise_parameter_sanitizer(:sign_up)
Добавление
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
Чтобы мой application_controller работал на меня
Обновить
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
Похоже, что devise обновил свои документы, и они хотят, чтобы он был настроен, как описано выше.
Предполагая, что вы используете bundle, вы можете получить доступ к devise gem, чтобы посмотреть на код:
bundle open devise
Если вам нужно переопределить стандартный контроллер devise, вы можете сделать это, скопировав контроллер из gem в контроллеры / devise/[имя файла] в вашем приложении, и он будет иметь приоритет. Обратите внимание, что если вы сделаете это, вам придется быть осторожным с обновлениями драгоценного камня.
Согласно предыдущему комментарию, почему вы смешиваете белый список с сильными параметрами; вам нужно только сильное параметры в рельсах 4 и 3