下面的行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
谢谢!
如果它有用,请忽略我的代码。我最感兴趣的是条件结构及其格式化的选项。
答案 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
但这可能仅仅是个人品味。