仅在找到对象时运行代码块

时间:2014-08-18 19:51:14

标签: 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

必须有一个更好的方法来解决这个问题,然后我就是......

3 个答案:

答案 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 },showeditupdate)。我在下面列举了一个例子。

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