如果是then else子句,那么编码这个更好的方法是什么?

时间:2010-09-16 13:19:48

标签: ruby-on-rails if-statement logic

我有以下代码。我还是Ruby on Rails的新手。你可以看到我重复了4次。

我试过这样的事情:

if @property.nil? || @property.status_id == 144 || (@property.status_id <= 16 && current_user.nil?) || (@property.status_id <= 16 && current_user.id != @property.user_id)

但是如果@property为零,它会给我很多错误。因为@ property.status_id无法被调用,因为@property是nil。

无论如何,我认为一位经验丰富的Ruby on Rails编码器会得到这个想法。

  def show
    @property = Property.find(params[:id]) rescue nil
    if @property.nil?
      flash[:error]=t("The_property_was_not_found")
      redirect_to root_path
      return
    end
    if @property.status_id == 144
      flash[:error]=t("The_property_was_not_found")
      redirect_to root_path
      return
    end
    if @property.status_id <= 16 && current_user.nil?
      flash[:error]=t("The_property_was_not_found")
      redirect_to root_path
      return
    end
    if @property.status_id <= 16 && current_user.id != @property.user_id
      flash[:error]=t("The_property_was_not_found")
      redirect_to root_path
      return
    end
    @images = Image.find(:all, :conditions =>{:property_id => params[:id]})
  end

4 个答案:

答案 0 :(得分:2)

def show
    @property = Property.find(params[:id]) rescue nil
    if @property.nil? || @property.status_id == 144 || (@property.status_id <= 16 && (current_user.nil? || current_user.id != @property.user_id))
      flash[:error]=t("The_property_was_not_found")
      redirect_to root_path
    else
      @images = Image.find(:all, :conditions =>{:property_id => params[:id]})
    end
  end

我不熟悉Ruby语法,所以这可能不会真正编译,但你明白了。

答案 1 :(得分:1)

这真的是确切的代码吗? || short-circuits和零值不应成为问题。

@property=nil
if @property.nil? || @property.status_id == 144
   puts @property.class.to_s
end

输出 NilClass

答案 2 :(得分:1)

我认为你应该通过将“can show”逻辑定义为一个简单的帮助方法来解决这个问题,你可以调用它来做出决定,而不是用最终使相同动作发生的各种分支混乱你的show方法。 / p>

def can_show_property?(property)
  return false unless (property)

  return false if (property.status_id == 144 or property.status_id > 16)

  return false unless (current_user && current_user.id == property.user_id)

  true
end

def show
  @property = Property.find(params[:id]) rescue nil

  unless (can_show_property?(@property))
    flash[:error]=t("The_property_was_not_found")
    redirect_to root_path
    return
  end

  @images = Image.find(:all, :conditions =>{ :property_id => params[:id] })
end

在您的代码中使用“魔术”数字(如144)会导致询问为什么它们不会被赋予常量。清楚标明MyApp::PROPERTY_LOCKED时,通常会更容易理解。

答案 3 :(得分:0)

你可以试试这个:

def show
begin 
  @property = Property.find(params[:id])
  if [144,16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0].include?(@property.status_id)
    flash[:error]=t("The_property_was_not_found")
    if current_user && (current_user.id != @property.user_id)
      redirect_to myimmonatie_path 
    else
      redirect_to root_path 
    end
rescue
  flash[:error]=t("The_property_was_not_found")
  redirect_to root_path
end
@images = Image.find(:all, :conditions =>{:property_id => params[:id]})