我的事件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在传递参数时显示点击的视频,如果没有传递参数,第一个视频属于该事件?
答案 0 :(得分:1)
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