0

作成したサンプル アプリがありますが、フィールドの編集に問題があります。フィールドを更新しようとすると、ページに password_confirmation フィールドを含めていなくても、ユーザー モデルで「validates :password_confirmation」がトリガーされます。

ここに私のコードのいくつかがあります:

これは、データを表示する「pages/services.html.erb」です

<h1>Shows all users</h1>

<% if current_user %>

<table border="1">
<% @column_names.each do |column_name| %>
    <% if column_name == "name" || column_name == "username" || column_name == "email"%>
        <td>
            <strong><%= column_name.capitalize %></strong>      
        </td>
    <% end %>
<% end %>

<% @users.each do |user| %>


    <tr>
        <td><%= user.name%></td>
        <td><%= user.username%></td>
        <td><%= user.email%></td>
        <td><%= link_to "edit", edit_user_path(user)%></td>
        <td><%= link_to "delete", '#'%></td>            
    </tr>
<%end%> 
</table>

<% end %>

これが私の「users/edit.html.erb」です。私はユーザーモデルfyiを持っています。

編集

<%= form_for @user do |f| %>
    <%= render 'shared/error_message' %>
    <p>
        <%= f.text_field :name%><br/>
        <%= f.label :name %><br/>
    </p>

    <p>
        <%= f.text_field :username %><br/>
        <%= f.label :username%><br/>
    </p>

    <p>
        <%= f.email_field :email%><br/>
        <%= f.label :email %><br/>
    </p>

    <p> <%= f.submit "Update" %></p>


<% end%>

ここに私のUsersControllerコードがあります:

class UsersController < ApplicationController

  def new
    @user = User.new
    @title = "User Sign Up"    
  end

  def create

    @user = User.new(params[:user])


    if @user.save
      sign_in_check @user
      redirect_to root_path, :flash => { :success => "Welcome to the Bakeshop"}
    else
      @title = "User Sign Up" 
      render 'new'
    end  
  end

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

  def update
    @user = User.find(params[:id])

    if @user.update_attributes(params[:user])
      redirect_to pages_services_path, :notice => "Update Successful"
    else
      render "edit"
    end
  end  
end

誰かがこの現象を説明し、修正を提案できますか?

編集

私のuser.rbファイルコードを追加しました:

class User < ActiveRecord::Base
  require 'digest/md5'

  attr_accessible :password_confirmation, :name, :email, :password, :username
  before_save :encrypt_password


  validates :name,  :presence => true,
                    :length => { :maximum => 25}

  validates :username,  :presence => true,
                        :length => { :maximum => 25},
                        :uniqueness => {:case_sensitive => false}                    

  validates :email, :presence => true,
                    :uniqueness => {:case_sensitive => false}

  validates :password, :presence => true, 
            :confirmation => true,
            :length => {:within => 6..40}

  validates :password_confirmation, :presence => true

  def self.authenticate(username, password)
    user = User.find_by_username(username)

    if user && user.password == Digest::MD5.hexdigest(password)
      user
    else
      nil
    end
  end

  def encrypt_password
    self.password = Digest::MD5.hexdigest(password)
  end
end
4

2 に答える 2

0

問題はここにあると思います:

  validates :password, :presence => true, 
            :confirmation => true,  #Confirm 1
            :length => {:within => 6..40}

  validates :password_confirmation, :presence => true  #Confirm 2

最初のvalidatesブロックで、私がマークしたコードconfirm 1は基本的に私がマークしたコードと同じことをしていますconfirm 2。パスワードを含むフィールドがある場合、このコードは自動的にそれを確認するため、必要なのは最初のブロックだけです。

2 番目のビットは、パスワード フィールドに明示的に関連付けられていないため、エラーを引き起こしています。そのため:password_confirmation、ユーザーを作成または更新する前に属性の存在を確認するよう Rails に要求していますが、これは不要です。それは理にかなっていますか?

于 2013-08-28T12:03:20.863 に答える