如果找到对象,是否有更简洁的方法来运行代码块?我正在测试,看看参数是否存在。如果没有对象,我肯定会出错。请原谅丑陋的代码:
def show
if params[:event_entry].to_i>1
event_entry = EventEntry.find(params[:event_entry])
#### Do something with event_entry here
end
end
必须有一个更好的方法来解决这个问题,然后我就是......
答案 0 :(得分:3)
我做:
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_entry]
是否存在,请执行:
def event_entry
return nil unless params[:event_entry]
@event_entry ||= EventEntry.find_by(id: params[:event_entry])
end
我不想检查它的整数值得吗
答案 1 :(得分:3)
更简洁的方法(在Rails 4中)是:
def show
if event_entry = EventEntry.find_by(id: params[:event_entry])
# Do something with `event_entry` here
end
end
如果记录不存在, find_by
将返回nil
,请参阅:http://api.rubyonrails.org/classes/ActiveRecord/FinderMethods.html#method-i-find_by
编辑:
正如@apneadiving在下面的评论中提到的那样,如果使用抽象方法完成这一点也很好,这样你就可以调用before_filter
和控制器的开头来获取适用的方法(比如{{1 },show
,edit
和update
)。我在下面列举了一个例子。
delete
现在,您可以在控制器开头的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_filter
。像
@event_entry
应该这样做。
注意:您可能还会在某些地方看到before_filter :set_event_entry, only: [:show, :edit, :update, :destroy]
而不是before_action
。其中任何一个都可以。
答案 2 :(得分:2)
您可以执行以下操作:
def show
if event_entry = EventEntry.where(id: params[:event_entry]).first
# Do something with `event_entry` here
end
end