ruby-on-rails-3 - 如何更新两个不同页面上的两个不同属性?

标签 ruby-on-rails-3

我有一个带有名称和密码属性的用户模型。当用户单击“编辑”时,我只希望名称字段可编辑和验证,而不是密码字段。当用户单击“重置密码”时反之亦然。 我认为我的主要问题是如何在名称字段编辑期间关闭密码验证以及如何在密码编辑期间关闭名称验证?

编辑.html.erb

<%= form_for @user, html: { class: "form_settings" } do |f| %>
  <%= render 'shared/error_messages', object: f.object %>
  <p><span><%= f.label :name %></span>
    <%= f.text_field :name %>
  </p>

  <p style="padding-top: 15px"><span>&nbsp;</span>
    <%= f.submit "Submit", class: "submit" %>
  </p>
<% end %>

reset_password.html.erb

<%= form_for @user, html: { class: "form_settings" } do |f| %>
  <%= render 'shared/error_messages', object: f.object %>
  <p><span><%= label_tag :old_password, "Current Password" %></span>
    <%= password_field_tag :old_password %>
  </p>

  <p><span><%= f.label :password %></span>
    <%= f.password_field :password %>
  </p>

  <p><span><%= f.label :password_confirmation %></span>
    <%= f.password_field :password_confirmation %>
  </p>

  <p style="padding-top: 15px"><span>&nbsp;</span>
    <%= f.submit "Submit", class: "submit" %>
  </p>
<% end %>

users_controller.rb

def update
  @user = User.find(params[:id])
  if params[:old_password]
    if @user.authenticate(params[:old_password])
      @user.update_attributes(password: params[:user][:password])
      flash[:success] = "Password has been updated"
      redirect_to @user
    else
      flash.now[:error] = "Current password is incorrect"
      render :reset_password
    end
  elsif @user.update_attributes(params[:user])
    flash[:success] = "User name updated"
    redirect_to @user
  else
    render :edit
  end
end

我的另一个问题是密码和密码确认验证不起作用。这就是我在模型中的内容:

validates :password, presence: true, confirmation: true

更新 获取了要重置的密码以及使用此代码进行的验证:

def update
  @user = User.find(params[:id])
  if params[:old_password]
    if @user.authenticate(params[:old_password])
      if params[:user][:password] == params[:user][:password_confirmation]
        @user.update_attributes(password: params[:user][:password])
        flash[:success] = "Password has been updated"
        redirect_to @user
      else
        flash.now[:error] = "Passwords don't match"
        render :reset_password
      end
    else
      flash.now[:error] = "Current password is incorrect"
      render :reset_password
    end
  elsif @user.update_attributes(params[:user])
    flash[:success] = "User name updated"
    redirect_to @user
  else
    render :edit
  end
end

但这对我来说似乎太复杂了。有人看到更简单的解决方案吗?

但是我仍然遇到编辑名称字段的问题。它说密码不能为空。

最佳答案

您不应在同一操作中混用名称编辑和密码重置。

创建一个将更新用户属性的操作,password 字段不应与 attr_accessible 一起列入白名单

创建另一项操作来处理密码重置。

def update
  @user = User.find(params[:id])
  if @user.update_attributes(params[:user])
    flash[:success] = "User name updated"
    redirect_to @user
  else
    render :edit
  end
end

def reset_password
  if params[:old_password] && @user.authenticate(params[:old_password])
    if params[:user][:password] == params[:user][:password_confirmation]
      @user.password = params[:user][:password]
      flash[:success] = "Password has been updated"
      redirect_to @user
    else
      flash.now[:error] = "Passwords don't match"
      render :reset_password
    end
  else
    flash.now[:error] = "Current password is incorrect"
    render :reset_password
  end
end

这样,每个 Action 都有其语义角色。

顺便说一句,我希望您使用 bcrypt 之类的东西来存储密码。

关于ruby-on-rails-3 - 如何更新两个不同页面上的两个不同属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15181747/

相关文章:

ruby-on-rails-3 - Rails 魔法错误?创建重复的用户帐户

ruby-on-rails - 如何使用 Ruby on Rails 在初始化程序中调用应用程序模型

ruby-on-rails - 为has_many 和belongs_to 创建Rails 模型关联

windows - JRuby on Rails 无法与在 Windows Server 2008 上作为服务运行的 Tomcat 一起使用

ruby-on-rails-3 - Rails 控制台 - 向上箭头不适用于最后一个命令

ruby-on-rails-3 - 使用远程 Postgres 数据库安装 Postgres Gem PG

ruby-on-rails - 如何在 Rails 3 的 Postgres 数据库中使用枚举?

ruby-on-rails - 向 Rails 模型实例对象动态添加哈希属性?

ruby-on-rails-3 - 嵌套:json包含在Rails中

ruby-on-rails - 在 before_filter 上使用 Rails 和 Omniauth 重定向循环