4

Rails 4.1 アプリケーションでユーザー認証にソーサリーを使用しています。すべて正常に動作します。しかし、(ソーサリーによって認証された) ユーザー モデルの特定の属性を更新しようとすると、パスワードが空白で短すぎるというエラーが表示されます。

これはコンソールからのスニペットです

> user = User.last  
=> # I get the user  
> user.update(about_me: "I'm a user")  
=> false  
> user.update(about_me: "I'm a user", password: "secret")  
=> true

ここに私のモデルコード
app/models/user.rb があります

class User < ActiveRecord::Base  
  authenticates_with_sorcery!  
  validates :password, presence: true, length: { minimum: 6 }  
  .....
end  

私のコントローラーコード
app/controllers/users_controller.rb

class UsersController < ApplicationController
  .....
  def edit
    @user = User.find(params[:id])
  end

  def update
    @user = User.find(params[:id])
    if @user.update(user_params)
        redirect_to @user
        flash[:notice] = "Profile successfully updated"
    else
        render 'edit'
    end
  end

  private
      def user_params
        params.require(:user).permit(:username, :name, :email, :password, :about_me)
      end

end

そして私の更新フォーム
app/views/users/edit.html.erb

<%= form_for @user, method: :put do |f| %>
  <% if @user.errors.any? %>
    <div class="alert">
      <p><%= pluralize(@user.errors.count, 'error') %></p>
      <ul>
        <% @user.errors.full_messages.each do |msg| %>
          <li><%= msg %></li>
        <% end %>
      </ul>
    </div>
  <% end %>
  <%= f.text_field :username, placeholder: 'Username' %>
  <%= f.text_field :name, placeholder: 'Name' %>
  <%= f.email_field :email, placeholder: 'Email' %>
  <%= f.text_area :about_me, placeholder: 'About me' %>
  <%= f.password_field :password, placeholder: 'Password' %>
  <%= f.submit 'Save Changes', class: 'button' %>
<% end %>

フォームからパスワード フィールドを削除すると、パスワードが空白であることとパスワードの長さに関するエラーが表示されます。これは魔術と関係がありますか、それともレール自体に欠けているものですか? 他に影響を与えずに電子メールフィールドのみを更新するより良い方法はありますか?

4

2 に答える 2

5
class User < ActiveRecord::Base  
  authenticates_with_sorcery!  
  validates :password, presence: true, length: { minimum: 6 }, if: :new_user?

  private
  def new_user?
    new_record?
  end
end  

検証は、独自のプライベート検証メソッド new_user? を追加した new_record の場合にのみチェックされます。この関数は、通常のサインアップ/登録中に true を返します。したがって、これらのサインアップでは、パスワードの検証のみが必要になります。

編集中、もちろんユーザーは既存のユーザー / new_record? になります。false を返します。したがって、パスワードの検証はスキップされます。

2 番目の方法:

class User < ActiveRecord::Base 
  attr_accessor :skip_password
  validates :password, presence: true, length: { minimum: 6 }, unless: :skip_password
end

 #users_controller.rb 
def update
  @user = User.find(params[:id])
  @user.skip_password = true 
  if @user.update(user_params)
     redirect_to @user
  else
     render 'edit'
  end
end

ここでは、独自のカスタム attr_accessor skip_password を追加しました。skip_password 値が true に設定されている場合、編集/更新中にパスワードの検証がスキップされます。

これらの方法の両方があなたに役立つことを願っています:)

于 2015-01-31T14:07:19.587 に答える