Rails验证页面中未包含的字段

时间:2013-08-28 11:51:49

标签: jquery html ruby-on-rails

我有一个我创建的示例应用,但我在编辑字段时遇到问题。每当我尝试更新我的字段时,即使我没有在页面中包含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

2 个答案:

答案 0 :(得分: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的代码完全相同。第一个块就是您需要的所有内容,因为当有一个带密码的字段时,此代码将自动确认它。

第二位导致错误,因为这与密码字段没有明确关联,因此您要求Rails在创建或更新用户之前确认是否存在:password_confirmation属性,这是不必要的。那有意义吗?

答案 1 :(得分:0)

即使您没有使用该类的所有字段,Rails也会对User类的验证器进行验证。

如果您不想在视图中使用或验证User类的所有字段,则应使用其他视图模型类,或者只删除您不想使用的验证(在本例中为password_confirmation)