写更简洁的Ruby

时间:2012-10-19 09:57:38

标签: ruby-on-rails ruby

下面的行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 个答案:

答案 0 :(得分: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

答案 1 :(得分: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

答案 2 :(得分: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个字符的行,我的建议就是告诉他们让他们做出决定或对他们的决定承担责任。

答案 3 :(得分:1)

关于:

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

您不必检查full_messages是否为空,当您将空数组传递给它时,不应呈现闪存。

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

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

但这可能仅仅是个人品味。