5

私は Ruby on Rails 環境に不慣れで、ほとんどの問題を解決できましたが、まだこの問題の解決策を見つけることができませんでした。

コンテキストを提供するには:

  • レールの使用 (4.0.0)
  • ワーデンの使用 (1.2.3)
  • デバイスの使用 (3.0.0)
  • ローリファイの使用 (3.2.0)
  • cancan の使用 (1.6.10)

私の問題

Deviseの登録で新しいユーザーをサインアップしたとき。:name フィールドがデータベースに追加されていません。サーバー出力を参照

ユーザーモデル(app/models/user.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

ユーザーコントローラー(app/controllers/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 の新しい登録ビュー(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" %>

アプリケーションコントローラー(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

4 に答える 4

10

Rails 4 は強力なパラメーターを使用します。

コントローラーを介してモデルに渡したいパラメーターを許可する必要があります。つまり、params を介したモデルの属性への直接関連付けは許可されなくなりました。パラメーター値がコントローラーを介してモデルに渡されると想定されるかどうかを指定する必要があります。

このブログでヘルプが見つかるかもしれません: http://edgeapi.rubyonrails.org/classes/ActionController/StrongParameters.html

または、私たちがあなたの問題を考慮しているかのように、デバイスの SessionsController をオーバーライドするか、使用することができます

devise_parameter_sanitizer(:sign_up)

詳細については、https ://github.com/plataformatec/devise#strong-parameters をご覧ください。

于 2013-07-22T11:54:10.173 に答える
0

application_controller に問題が見つかりました。

devise_parameter_sanitizer.for(:sign_in) ...

する必要があります

devise_parameter_sanitizer.for(:sign_up)...

私に代わってわずかな見落としですが、助けてくれてありがとう。

于 2013-07-22T11:21:12.583 に答える