Techioz Blog

このアクションでレンダリングやリダイレクトが複数回呼び出されました。 render または redirect を呼び出すことができるのは、アクションの問題ごとに最大 1 回だけです。

概要

ページネーション ボタンまたはカンバン ボード カードのスクロブル バーを使用してページを変更すると、コントローラの同じアクションでレンダリングとリダイレクトの両方を実行しようとすると、Ruby on Rails で DoubleRenderError が発生します。エラーが示すように、アクションごとに render または redirect_to を 1 回だけ呼び出すことができます。

  def index
    session[:current_page] = "all_request"
    default_per_page = 15
    @per_page = params[:per_page] || session[:per_page] || default_per_page
    session[:per_page] = @per_page
    @q = ClientRequest.includes(:resource_infos, :developers).page(params[:page]).per(@per_page).ransack(params[:q])
    if (params[:q] && @filter_per_page_value = params[:q][:per_page_eq]) != nil
      @per_page = @filter_per_page_value
      @q = ClientRequest.includes(:resource_infos, :developers).page(params[:page]).per(@per_page).ransack(params[:q])
    end
    @client_requests = @q.result

    kanban_view_details
    render_partials
  end



  def kanban_view_details
    kanban_column_data = KanbanColumn.in_order_of(:name, KanbanViewHelper::KANBAN_COLUMN_ORDER.keys)
    @grouped_kanban_columns = {}
    kanban_column_data.each do |kanban_column|
      custom_sorting_expression, sorted_records = generate_sorted_records(kanban_column)
      pagy, client_requests = pagy_countless(sorted_records, items: 6, page_param: kanban_column.name)
      @grouped_kanban_columns[kanban_column] = [pagy, client_requests]
    end
    load_cache
    @pagy, @kanban_columns = pagy_countless(kanban_column_data, items: 9)
  
    if params[:page]
      render "scrollable_list"
    elsif params[:load]
      render partial: "kanban_views/common_view/common_kanban_page"
    end
  end


  def render_partials
    kanban_view_details
    partial_name = params[:name]
    if partial_name == "classic_view"
      render partial: "classic_views/classic_view"
    elsif partial_name == "kanban_view"
      load_cache
      render partial: "kanban_views/common_view/common_kanban_page", locals: { client_request_cache: @client_request_cache }
    end
  end

解決策

カンバでレンダリングを呼び出し、インデックスで最終レンダリングを呼び出していると思います。インデックスが返されないように、カンバスのレンダリング後にリターンがある場合は、コードを変更するだけです。