Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 仅当找到对象时才运行代码块_Ruby On Rails_Ruby On Rails 4 - Fatal编程技术网

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,因为您将调用该方法来处理对象。请注意,将局部变量抽象为方法是一种设计模式,因此是一种很好的做法。你可以,只是没有必要。我不是说你错了。首先要做的事情:抽象,然后在必要时使用回调(但要小心回调)