0

イベント 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 がパラメーターに渡されない場合、次のエラーが発生します。

Couldn't find Video without an ID

|| だと思った オペレーターは @event.videos.find(params[:video] の部分をスキップして、表示するイベントに関連付けられた最初のビデオを選択するだけですが、明らかにこれはもう起こっていません。確かなことは言えませんが、ビデオに。

ビデオはイベントに属し、イベントには多くのビデオがあります。

@video にパラメーターが渡されたときにクリックされたビデオを表示し、パラメーターが渡されていない場合はイベントに属する最初のビデオを表示する方法を教えてもらえますか?

4

3 に答える 3

1

findそのようなIDを持つレコードがない場合、メソッドは例外をスローします(あなたの場合はnil)。この行を試してください:

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

find_by_idparams[:video] が空白の場合、メソッドは nil を返し、それが@event.videos.first返されます。

また、コードにバグがあると思います: 2 行目 ( Event.find_by_name(params[:id])) を見てください。nil を返した場合、nil でメソッドを@event.videos.present?呼び出したときに例外がスローされます。videos

于 2013-11-01T13:31:15.357 に答える
1

三項条件はあなたが必要とするものです..

@video = params[:video].present?  ? @event.videos.find(params[:video]) : @event.videos.first
于 2013-11-01T13:33:06.550 に答える
0

これを試してみてください

if params[:video].nil?
    @video = @event.videos.first
else
   @video = @event.videos.find(params[:video])
end       
于 2013-11-01T13:29:53.520 に答える