Ruby on rails 仅当找到对象时才运行代码块
是否有一种更干净的方法,仅在找到对象时运行代码块?我目前正在测试这个参数是否存在。如果没有物体,我肯定会出错。请原谅这丑陋的代码:Ruby on rails 仅当找到对象时才运行代码块,ruby-on-rails,ruby-on-rails-4,Ruby On Rails,Ruby On Rails 4,是否有一种更干净的方法,仅在找到对象时运行代码块?我目前正在测试这个参数是否存在。如果没有物体,我肯定会出错。请原谅这丑陋的代码: def show if params[:event_entry].to_i>1 event_entry = EventEntry.find(params[:event_entry]) #### Do something with event_entry here end end 必须有更好的方法来解决这个问题,那么我…我会: def
def show
if params[:event_entry].to_i>1
event_entry = EventEntry.find(params[:event_entry])
#### Do something with event_entry here
end
end
必须有更好的方法来解决这个问题,那么我…我会:
def show
if event_entry
#### Do something with event_entry here
end
end
private
def event_entry
@event_entry ||= EventEntry.find_by(id: params[:event_entry]) # which returns nil if params[:event_entry] is nil
end
如果确实要检查params[:event\u entry]
是否存在,请执行以下操作:
def event_entry
return nil unless params[:event_entry]
@event_entry ||= EventEntry.find_by(id: params[:event_entry])
end
我不想检查它是否是一个真正值得的整数我会:
def show
if event_entry
#### Do something with event_entry here
end
end
private
def event_entry
@event_entry ||= EventEntry.find_by(id: params[:event_entry]) # which returns nil if params[:event_entry] is nil
end
如果确实要检查params[:event\u entry]
是否存在,请执行以下操作:
def event_entry
return nil unless params[:event_entry]
@event_entry ||= EventEntry.find_by(id: params[:event_entry])
end
我不想检查它是否是一个真正值得的整数您可以执行以下操作:
def show
if event_entry = EventEntry.where(id: params[:event_entry]).first
# Do something with `event_entry` here
end
end
您可以执行以下操作:
def show
if event_entry = EventEntry.where(id: params[:event_entry]).first
# Do something with `event_entry` here
end
end
更干净的方法(在Rails 4中)是:
find_by
将返回nil
如果记录不存在,请参阅:
编辑:
正如@apreading在下面的评论中所提到的,如果使用一个抽象方法来完成这项工作,那么您可以在过滤器之前调用,并在控制器开始时调用适用的方法(例如显示
,编辑
,更新
和删除
)。下面我举了一个例子
class EventEntriesController < ApplicationController
before_filter :set_event_entry, only: :show
def show
# You have access to @event_entry because it was set before this method was called
end
private
def set_event_entry
@event_entry = EventEntry.find_by(id: params[:event_entry])
end
end
我们应该做到这一点
注意:您还可以看到在某些地方使用了before\u action
,而不是before\u filter
。这两种方法中的任何一种都会起作用。一种更干净的方法(在Rails 4中)是:
find_by
将返回nil
如果记录不存在,请参阅:
编辑:
正如@apreading在下面的评论中所提到的,如果使用一个抽象方法来完成这项工作,那么您可以在过滤器
之前调用,并在控制器开始时调用适用的方法(例如显示
,编辑
,更新
和删除
)。下面我举了一个例子
class EventEntriesController < ApplicationController
before_filter :set_event_entry, only: :show
def show
# You have access to @event_entry because it was set before this method was called
end
private
def set_event_entry
@event_entry = EventEntry.find_by(id: params[:event_entry])
end
end
我们应该做到这一点
注意:您还可以看到在某些地方使用了before\u action
,而不是before\u filter
。这两种方法都可以使用。可以,但最好用一种方法将其抽象出来,以便在其他应用程序中重用actions@apneadiving我完全同意。。。如果这将在每个方法中使用,您应该在筛选之前使用,并在适用的方法之前设置@event\u entry
,即显示
,编辑
,删除
和更新
。然而,您的答案并没有完全说明如何做到这一点(您在筛选之前缺少了)。虽然你的方法可行,但它不是很像Rails-4-ish。我已经更新了我的答案来说明应该如何做。更新和删除不需要使用before,因为您将调用该方法来处理对象。请注意,将局部变量抽象为方法是一种设计模式,因此是一种很好的做法。你可以,只是没有必要。我不是说你错了。首先要做的事情:抽象,然后如果必要的话使用回调(但是要小心回调),好的,但是最好在一个方法中抽象它,以便在其他方法中重用actions@apneadiving我完全同意。。。如果这将在每个方法中使用,您应该在筛选之前使用,并在适用的方法之前设置@event\u entry
,即显示
,编辑
,删除
和更新
。然而,您的答案并没有完全说明如何做到这一点(您在筛选之前缺少了)。虽然你的方法可行,但它不是很像Rails-4-ish。我已经更新了我的答案来说明应该如何做。更新和删除不需要使用before,因为您将调用该方法来处理对象。请注意,将局部变量抽象为方法是一种设计模式,因此是一种很好的做法。你可以,只是没有必要。我不是说你错了。首先要做的事情:抽象,然后在必要时使用回调(但要小心回调)