如果不存在,如何停止控制器查找视频ID

时间:2013-11-01 13:22:46

标签: ruby-on-rails

我的事件show controller中有以下代码:

  def show
    @event = Event.find_by_name(params[:id])
    if request.path != event_path(@event)
      redirect_to @event, status: :moved_permanently
    end
    if @event.videos.present?
      @video = @event.videos.find(params[:video]) || @event.videos.first
      if :video_id.present? && current_user && @video.premium?
        @order = Order.new(user_id: current_user.id, video_id: @video.id, price: @video.price)    
      elsif :event_id.present? && current_user && @event.premium?
        @order = Order.new(user_id: current_user.id, event_id: @event.id, price: @event.price)    
      end
    end
    @user = User.new
  end

这一行:

      @video = @event.videos.find(params[:video]) || @event.videos.first

如果视频已经通过ID传递到参数中,应该找到视频,例如通过以下链接:

event_path(video.event.name, video: video)

当视频传递到参数时,应用程序正常工作,正确的视频会显示正确的视频。

但是,当视频ID没有传递给params时,我收到以下错误:

Couldn't find Video without an ID

我以为是||运营商会跳过@ event.videos.find(params [:video]部分,只选择与该事件相关的第一个视频进行显示,但显然不再发生这种情况,我认为自添加friendly_id以来已经引入了这个问题对于视频,虽然我不能肯定地说。

视频属于事件,事件有很多视频。

任何人都可以帮我告诉我如何让@video在传递参数时显示点击的视频,如果没有传递参数,第一个视频属于该事件?

3 个答案:

答案 0 :(得分:1)

如果没有具有此类id的记录,则

find方法会抛出异常(在您的情况下为nil)。试试这一行:

@video = @event.videos.find_by_id(params[:video]) || @event.videos.first

如果params [:video]为空,则find_by_id方法将返回nil,并且会返回@event.videos.first

此外,我认为您的代码中存在错误:请查看第二行(Event.find_by_name(params[:id]))。如果它返回nil,那么稍后在{n}上调用@event.videos.present?方法时会引发异常videos

答案 1 :(得分:1)

三元条件是你需要的......

@video = params[:video].present?  ? @event.videos.find(params[:video]) : @event.videos.first

答案 2 :(得分:0)

试试这个

if params[:video].nil?
    @video = @event.videos.first
else
   @video = @event.videos.find(params[:video])
end