21

registrations#new にいくつかのフィールドを追加しようとしています。追加のデータのみが必要で、別の機能は必要ないため、コントローラーなどをオーバーライドする必要がある理由がわかりません。したがって、registrations#new を次のように変更しました。

%h2
  Sign up
= form_for(resource, as: resource_name, url: registration_path(resource_name)) do ||f
  = devise_error_messages!
  %div
    = f.label :email
    %br
    = f.email_field :email, autofocus: true
  %div
    = f.label :title_id
    %br
    = f.text_field :title_id
  %div
    = f.label :province_id
    %br
    = f.text_field :province_id
  %div
    = f.label :first_name
    %br
    = f.text_field :first_name
  %div
    = f.label :last_name
    %br
    = f.text_field :last_name
  %div
    = f.label :password
    %br
    = f.password_field :password
  %div
    = f.label :password_confirmation
    %br
    = f.password_field :password_confirmation
  %div= f.submit 'Sign up'
= render 'devise/shared/links'

これらの追加フィールドをサニタイザーで有効にするために、ApplicationController を次のように更新しました。

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 :store_requested_url!
  # before_filter :authenticate_user!

  def configure_permitted_parameters
    devise_parameter_sanitizer.for(:sign_in) { |u| u.permit(:email) }
    devise_parameter_sanitizer.for(:sign_up) { |u| u.permit(:email, :password, :password_confirmation, :title_id, :province_id, :first_name, :last_name) }
    devise_parameter_sanitizer.for(:account_update) { |u| u.permit(:email, :password, :password_confirmation, :current_password) }
  end

  def after_sign_in_path_for(resource)
    session[:requested_url] || root_path
  end

  private

  def store_requested_url
    # store last url as long as it isn't a /users path
    session[:previous_url] = request.fullpath unless request.fullpath == /\/users/
  end
end

何らかの理由で機能せず、余分なフィールドがヌルとしてデータベースに送られます。

Ruby 2 と Rails 4 rc1 を Devise 3.0.0.rc で使用しています。

4

8 に答える 8

31

サニタイザーを呼び出すように before_filter を設定していないため、質問のコード サンプルが機能していないように見えます。

before_filter :configure_permitted_parameters, if: :devise_controller?

そうは言っても、受け入れられた回答に示されているように、コントローラーをオーバーライドして、アプリケーションコントローラーが常にこのチェックを行わないようにすることをお勧めします。受け入れられた回答は、以下のコードで短縮できます。このコードを自分のアプリケーションでテストしたところ、うまく機能しました。これらはすべて、 READMEの Strong Parameters セクションの3.0.0.rc タグに記載されています。

コントローラーをオーバーライドします。

class RegistrationsController < Devise::RegistrationsController
  before_filter :configure_permitted_parameters, :only => [:create]

  protected

    def configure_permitted_parameters
      devise_parameter_sanitizer.for(:sign_up) { |u| u.permit(:username, :email, :password) }
    end
end

次に、それを使用するようにルートを更新します。

devise_for :members, :controllers => { :registrations => "registrations" }
于 2013-06-06T23:35:52.973 に答える
12

Devise 4.0 以降、このトピックに関する古い回答は無効です。for使用する必要がある方法の代わりに:

devise_parameter_sanitizer.permit(:sign_up, keys: [:username])

したがって、完全なソリューションの場合ApplicationController:

class ApplicationController < ActionController::Base
  before_action :configure_permitted_parameters, if: :devise_controller?

  protected
    def configure_permitted_parameters
       devise_parameter_sanitizer.permit(:sign_up, keys: [:username])
    end
end
于 2016-08-18T21:44:08.097 に答える
10

OK、だから私がしたことは、Deviseの登録コントローラーをオーバーライドし、これを反映するようにdeviseのドキュメントに従ってroutes.rbを更新し、registrations#createのDeviseコードをそのままコピーして貼り付け、取得するparams部分を変更して自分のものを使用することでした強力なパラメーターの方法、そしてそれがそれでした。

class RegistrationsController < Devise::RegistrationsController

  def create
    build_resource(registration_params)

    if resource.save
      if resource.active_for_authentication?
        set_flash_message :notice, :signed_up if is_navigational_format?
        sign_up(resource_name, resource)
        respond_with resource, :location => after_sign_up_path_for(resource)
      else
        set_flash_message :notice, :"signed_up_but_#{resource.inactive_message}" if is_navigational_format?
        respond_with resource, :location => after_sign_up_path_for(resource)
      end
    else
      clean_up_passwords
      respond_with resource
    end
  end  

  private

  def registration_params
    params.require(:user).permit(:email, :title_id, :first_name, :last_name, 
      :province_id, :password, :password_confirmation)
  end

end
于 2013-05-12T00:11:45.210 に答える
6

同様の状況がありました(フィールドが異なるだけです)。

公式ドキュメントが提供できる方法は次のとおりです。これを ApplicationController に追加するだけです。「ユーザー名」を必要なものに変更し、必要に応じてさらに追加します。

before_action :configure_permitted_parameters, if: :devise_controller?

  protected

  def configure_permitted_parameters
    devise_parameter_sanitizer.for(:sign_up) << :username
  end

私のアプリケーションコントローラーは次のようになります。

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_action :configure_permitted_parameters, if: :devise_controller?

  protected

    def configure_permitted_parameters
      devise_parameter_sanitizer.for(:sign_up) << :public_name
    end
end

詳細はこちら: https://github.com/plataformatec/devise (「強力なパラメーター」)

于 2015-01-26T14:35:21.380 に答える
3

まず、Rails 4 には新しい「強力なパラメーター」の問題はありませんか。これについても調べてみてください。

新しいパラメーターをユーザー モデルに移行する場合。あとは、ファイルを上書き (作成) するだけです。

app/views/devise/registrations/edit.html.erb
app/views/devise/registrations/new.html.erb

ここでデフォルトのファイルを見ることができます: https://github.com/plataformatec/devise/tree/master/app/views/devise/registrations

独自の registrations_controller.rb (アクション new および edit) と独自の @variables を実装したい場合は、routes.rb にこれを追加することが重要です。

devise_for :users, :controllers => { :registrations => 'registrations' }
resources :users

これにより、デバイスが新しい「登録」コントローラーを取得することが保証されます (作成することにした場合)。

「消毒剤」またはこれが何に適しているのかわかりません。しかし、私のアプリは、私がお勧めしたばかりの小さな変更を加えても問題なく動作します。Controller をオーバーライドする必要はありません。ビューをオーバーライドするだけで十分です。

于 2013-05-09T21:49:31.933 に答える