2

基本的にメールによる認証であるclearance gemを使用しています。

メールでログインを維持したいのですが、ユーザーの登録フォームに「名前」フィールドを追加したいと考えています。

ユーザー.rb

class User < ActiveRecord::Base
  include Clearance::User

  validates_presence_of :name
  validates_uniqueness_of :name
end

users_controller.rb

class UsersController < Clearance::UsersController
  def create
    @user = user_from_params

    if @user.save(permit_params)
      sign_in @user
      render :json => {:success => true}
    else
      render :json => {:success => false}
    end
  end

  private

  def user_from_params
    user_params = params[:user] || Hash.new
    email = user_params.delete(:email)
    password = user_params.delete(:password)

    Clearance.configuration.user_model.new(user_params).tap do |user|
      user.email = email
      user.password = password
    end
  end

  def permit_params
    params.require(:user).permit(:name, :email, :encrypted_password, :password, :confirmation_token, :remember_token)
  end
end

ご覧のとおり、アクセス許可を追加しました.saveが、アプリは要求に応じて次のエラーをスローします。

ActiveModel::ForbiddenAttributesError in Clearance::UsersController#create

フォームからテキスト フィールドを削除すると:nameすべて機能しますが、フォームに追加のフィールドが必要です。

4

4 に答える 4

2

更新:ポイントが不足していたため、以前の回答を変更しました。

あなたが提供したコードは問題ありません。取得してActiveModel::ForbiddenAttributesErrorいる理由は、Clearance Users Controller をオーバーライドしていないためです。

config/routes.rb に以下を追加して、Clearance のエンジン内のコントローラーの代わりにオーバーライド コントローラーを使用するようにアプリに指示する必要があります。

resources :users,
  controller: 'users',
  only: 'create'

Clearance::UsersControllerIMOこれは、上記のアプリケーションコードに新しいものを書くよりも優れています.

于 2013-11-01T13:34:51.120 に答える
1

私は両方の方法を試してみましたが、許可パラメーターは必要ないことに気付きました。次の 4 つのことだけを行う必要があります。

  • 移行に名前列を追加する
  • gem コントローラーをオーバーライドする app/controllers/users_contoller.rbを作成します。
  • app/views/users/new.html.erbという名前を受け入れる新しいフォームを作成します
  • ルートを変更する

生成されたマイグレーションから開始rails generate clearance:install(実行前rake db:migrate)

  1. 移行が次のようになるように、インデックスを持つ列を追加しname:stringます。この列を追加すると、ユーザー パラメータの作成に含まれます。

    def change
      change_table :users do |t|
        t.timestamps null: false
        t.string :email, null: false
        t.string :name, null: false, limit: 50
        t.string :encrypted_password, limit: 128, null: false
        t.string :confirmation_token, limit: 128
        t.string :remember_token, limit: 128, null: false
      end
    
      add_index :users, :name
      add_index :users, :email
      add_index :users, :remember_token
    end
    

次に、2 つのファイルを作成するだけです。

app/controllers/users_controller.rb

class UsersController < Clearance::UsersController

  def create
    @user = user_from_params

    if @user.save
      sign_in @user
      redirect_to '/'
    else
      render template: 'users/new'
    end 
  end 

  private

  def user_from_params
    user_params = params[:user] || Hash.new
    name = user_params.delete(:name)
    email = user_params.delete(:email)
    password = user_params.delete(:password)

    Clearance.configuration.user_model.new(user_params).tap do |user|
      user.name = name
      user.email = email
      user.password = password
    end
  end
end

アプリ/ビュー/ユーザー/new.html.erb

<div id='clearance' class='sign-up'>
  <h2><%= t('.title') %></h2>

  <%= form_for @user do |form| %>
  <div class='text-field'>
    <%= form.label :name %>
    <%= form.text_field :name, :type => 'name' %>
  </div>

  <div class='text-field'>
    <%= form.label :email %>
    <%= form.text_field :email, :type => 'email' %>
  </div>

  <div class='password-field'>
    <%= form.label :password %>
    <%= form.password_field :password %>
  </div>

  <div class='submit-field'>
    <%= form.submit %>
  </div>

  <div class='other-links'>
    <%= link_to t('.sign_in'), sign_in_path %>
  </div>
  <% end %>
</div>

次に、ルートにこれを含める必要があります

resources :users,
    controller: 'users',
    only: 'create'
于 2014-04-07T01:22:57.333 に答える