我有以下代码。我还是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
根
答案 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]})
端