53

レールを扱うのは非常に新しいです。Devise を使用して基本的なログイン システムを実装しました。sign_up ページにいくつかの新しいフィールド (bio:string、name:string) を追加しようとしています。すべてが正しく表示され、新しいフィールドがデータベースに追加されますが (SQLbrowser で表示すると)、データが入力されず、ユーザーがサインアップ フォームを送信した後に次のようなメッセージが表示されます。

Unpermitted parameters: bio, name

2 つの文字列を _devise_create_users.rb に追加しました

  # added
  t.string :bio
  t.string :name

そして、私はそれらをschema.rbに表示しています

ActiveRecord::Schema.define(version: 20130629002343) do

  create_table "users", force: true do |t|
    t.string   "email",                  default: "",    null: false
    t.string   "encrypted_password",     default: "",    null: false
    t.string   "reset_password_token"
    t.datetime "reset_password_sent_at"
    t.datetime "remember_created_at"
    t.integer  "sign_in_count",          default: 0
    t.datetime "current_sign_in_at"
    t.datetime "last_sign_in_at"
    t.string   "current_sign_in_ip"
    t.string   "last_sign_in_ip"
    t.datetime "created_at"
    t.datetime "updated_at"
    t.string   "shortbio"
    t.boolean  "admin",                  default: false
    t.string   "realname"
    t.string   "name"
    t.string   "bio"
  end

  add_index "users", ["email"], name: "index_users_on_email", unique: true
  add_index "users", ["reset_password_token"], name: "index_users_on_reset_password_token", unique: true

end

私のuser.rb

class User < ActiveRecord::Base
  # Include default devise modules. Others available are:
   #:token_authenticatable, :confirmable,
   #:lockable, :timeoutable and :omniauthable
  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :trackable, :validatable

end

この問題は強力なパラメーターと関係がありますか? それらと、どこで/どのように実装するかについて頭を悩ませています。

4

7 に答える 7

71

受け入れられた解決策で十分ですが、2 つの問題が見られます。1) 現在のコントローラーがデバイス コントローラーであるかどうか ( )if: :devise_controller?をすべてのコントローラーがチェックし、2) 受け入れ可能なすべてのパラメーターをメソッド ( ...for(:sign_up) {|u| u.permit(:bio, :name)}) に:email:password等々。

よりエレガントなソリューションは次のようになると思います。

# app/controllers/users/registrations_controller.rb
class Users::RegistrationsController < Devise::RegistrationsController
  before_filter :configure_permitted_parameters

  protected

  def configure_permitted_parameters
    devise_parameter_sanitizer.for(:sign_up).push(:name, :phone, :organization)
  end
end

# config/routes.rb
devise_for :users, :controllers => { :registrations => "users/registrations" }

注: Rails 4.2+ の更新

この答えは古くなっています:

于 2013-09-26T18:57:45.903 に答える
11

私もこれには困りました。いくつかのフォーラムだけでなく、devise のサイトのドキュメントも役に立ちました。これが私がやったことです:

カスタムRegistrationsController (app/controllers/users/registrations_controller.rb)

# app/controllers/users/registrations_controller.rb

class Users::RegistrationsController < Devise::RegistrationsController
    before_filter :update_sanitized_params, if: :devise_controller?

    def update_sanitized_params
       devise_parameter_sanitizer.for(:sign_up) {|u| u.permit(:name, :email,   :password, :password_confirmation)}
    end
end

次に、ルート ファイル (config/routes.rb) で、devise_for ステートメントにこれを使用します。

devise_for :users, controllers: {registrations: "users/registrations"}
于 2013-07-04T04:19:35.273 に答える
4

Rails 4.2.1アプリで機能する別の簡単な方法を次に示します。

次のファイルを作成します

/config/initializers/devise_permitted_parameters.rb

そしてコード..

module DevisePermittedParameters
  extend ActiveSupport::Concern

  included do
    before_filter :configure_permitted_parameters
  end

  protected

  def configure_permitted_parameters
    devise_parameter_sanitizer.for(:sign_up) << :name
    devise_parameter_sanitizer.for(:account_update) << :name

    devise_parameter_sanitizer.for(:sign_up) << :bio
    devise_parameter_sanitizer.for(:account_update) << :bio
  end

end

DeviseController.send :include, DevisePermittedParameters
于 2015-08-18T00:14:56.503 に答える