1

1.5.以下太长(我的理解是建议截断 80 个字符)。编写此代码的最佳方法是什么?特别是条件的结构 - 有哪些替代代码格式选项

if @user.authenticate(params[:current_password]) && @user.update_attributes(params[:user])
  sign_in @user
  redirect_to @user, notice:["Profile update successful."]
else
  flash.now[:error] = @user.errors.full_messages unless @user.errors.full_messages.empty?
  render :edit
end

谢谢!

更新

如果有帮助,请忽略我的代码。我最感兴趣的是条件结构及其格式的选项。

4

4 回答 4

2

第 5 行可以完全删除。渲染时无需使用闪光灯。仅在重定向时才需要。对于身份验证,您可能需要设置一个before_filter. 有了这个,您的代码可以如下所示:

class UsersController < ApplicationController
  before_filter :require_logged_in_user, :only => [:edit, :update]

  # Note: @user is set in require_logged_in_user
  def update
    if @user.update_attributes(params[:user])
      sign_in @user
      redirect_to @user, notice: "Profile update successful."
    else
      render :edit
    end
  end

  private

  def require_logged_in_user
    @user = User.find(params[:id])
    redirect_to '/login' unless @user.authenticate(params[:current_password])
  end
end
于 2012-10-19T10:23:04.553 回答
2

您正在合并 IMO 应分别处理的两个条件(保持干净的条件分支非常重要)。我会写:

if !@user.authenticate(params[:current_password]) 
  flash[:error] = "Authentication failed"
  render :edit
elsif !@user.update_attributes(params[:user])
  # are you sure about this one? Rails helpers should show these errors.
  flash[:error] = @user.errors.full_messages.to_sentence
  render :edit
else
  sign_in @user
  redirect_to @user, notice: "Profile update successful"
end
于 2012-10-19T11:40:19.973 回答
2

使用时&&||您可以将条件拆分为多行:

if @user.authenticate(params[:current_password]) && 
   @user.update_attributes(params[:user])
     # I line up the conditionals
     # and indent the code after the conditionals further
     # just for clarity
else
  # ...

但是,如果您发现有人使用的文本编辑器不换行超过 80 个字符,我的建议是告诉他们找一个可以执行或为他们的决定承担责任的编辑器。

于 2012-10-19T11:57:22.527 回答
1

有关 :

flash.now[:error] = @user.errors.full_messages unless @user.errors.full_messages.empty?

您不必检查 full_messages 是否为空,当您传递一个空数组时不应渲染 flash。

但就个人而言,我会尝试只使用“撞”的方法,并拯救它们:

begin
  @user.authenticate!(params[:current_password])
  @user.update_attributes!(params[:user])
  sign_in @user
  redirect_to @user, notice: "Profile update successful"
rescue ActiveRecord::RecordInvalid => e # for example
  flash.now[:error] = @user.errors.full_messages
  render :edit
end

但这可能只是个人口味。

于 2012-10-19T10:22:13.550 回答