在此操作中多次调用渲染和/或重定向。您只能调用 render 或重定向,并且每个操作问题最多调用一次

Render and/or redirect were called multiple times in this action. You may only call render OR redirect, and at most once per action issue

提问人:Rahul kumar 提问时间:11/11/2023 最后编辑:engineersmnkyRahul kumar 更新时间:11/18/2023 访问量:78

问:

当我使用分页按钮或使用看板卡中的 scrobble 栏更改页面时,当我尝试在控制器的同一操作中渲染和重定向时,会在 Ruby on Rails 中获取 DoubleRenderError。正如错误所暗示的那样,每个操作只能调用一次 render 或 redirect_to

  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
ruby-on-rails ruby 控制器 http-redirect ruby-on-rails-7

评论

2赞 engineersmnky 11/11/2023
看来你没有真正问过问题吗?您只是重申了错误已经告诉您的问题。请澄清。
0赞 Rahul kumar 11/11/2023
我想解决 AbstractController::D oubleRenderError 并确保呈现在 ClientRequestsController#index 操作中只发生一次,即使在与分页或看板交互时也是如此。
1赞 engineersmnky 11/11/2023
好调用(which call),也调用which calls(which calls)和调用。因此,理论上的动作尝试调用 3 次。您似乎从视图角度和控制器角度混淆了渲染。要解决这个问题,你只需要为每个操作调用一次渲染;但是,如何实现您的实际目标尚不清楚,因为我们不知道您在这种情况下实际想要做什么。indexkanban_view_detailsrenderindexrender_partialskanban_view_detailsrenderrender_partialsrenderindexrender

答:

0赞 Christian Martin 11/11/2023 #1

我认为您正在 kambas 中调用渲染,并在索引中调用最终渲染。只需更改代码以使其呈现 kambas has a return after 以防止索引返回

评论

0赞 Nsikan Sylvester 11/18/2023
你能举个例子来验证你的答案吗?
0赞 Nsikan Sylvester 11/18/2023
您的答案可以通过额外的支持信息得到改进。请编辑以添加更多详细信息,例如引文或文档,以便其他人可以确认您的答案是正确的。您可以在帮助中心找到有关如何写出好答案的更多信息。
1赞 Adesoji Alu 11/14/2023 #2

Ruby V7 文档中明确指出了这一点: https://api.rubyonrails.org/classes/AbstractController/DoubleRenderError.html DEFAULT_MESSAGE = “在此操作中多次调用渲染和/或重定向。请注意,您只能调用 render 或 redirect,并且每个操作最多调用一次。另请注意,重定向和渲染都不会终止操作的执行,因此,如果要在重定向后退出操作,则需要执行类似“redirect_to(...);返回”。

在索引操作中,按顺序调用方法 kanban_view_details 和 render_partials。这两种方法都包含呈现调用,如果同时满足这两种方法中的呈现条件,则可能导致 DoubleRenderError。要解决此问题,您需要确保每个操作只发生一次渲染或重定向,如前面的默认消息所示。像这样重构你的代码

红宝石

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"
   @already_rendered = true
 elsif params[:load]
   render partial: "kanban_views/common_view/common_kanban_page"
   @already_rendered = true
 end
end
  if params[:page]
    render "scrollable_list"
    @already_rendered = true
  elsif params[:load]
    render partial: "kanban_views/common_view/common_kanban_page"
    @already_rendered = true
  end
end

def render_partials
  # Skip if already rendered
  return if @already_rendered

  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

    

评论

0赞 Rahul kumar 11/14/2023
但是现在,当将页面从页码 1 更改为页码 2 时,没有数据在经典视图中获取和显示
0赞 Adesoji Alu 11/15/2023
@Rahulkumar请您提醒我我回复的错误吗?
0赞 Rahul kumar 11/15/2023
在此操作错误中多次调用渲染和/或重定向,我在更改页面或滚动看板视图票证时遇到了该错误。对于这个问题,您已经给了我解决方案,现在问题已解决,但是当我将页面从第 1 页更改为第 2 页时,经典视图中没有获取和显示任何数据
0赞 engineersmnky 11/15/2023
你有一个语法错误以及一个非常尴尬的实现,同样会导致根本没有渲染调用。