从around_action回调中渲染控制器操作的视图

5
我正在渲染一个js.erb局部文件,它可以启用ajax功能来喜欢/不喜欢餐厅菜肴。我最近遇到了around_action回调,并想到yield将有助于先执行控制器操作,再呈现模板。不幸的是,由于respond_to从未被调用,我得到了500(内部服务器错误)
如果我将respond_to方法放在控制器操作内部而不是回调内部,它会起作用。我做错了什么?
class DishesController < ApplicationController
  before_action :set_dish_and_restaurant
  around_action :render_vote_partial

  def like
    @dish.liked_by current_user
  end

  ...

  private
    def set_dish_and_restaurant
      @dish = Dish.find(params[:id])
    end

    def render_vote_partial
      yield
      respond_to { |format| format.js { render "vote.js.erb" } }
    end
end

控制台错误

ActionView::MissingTemplate (Missing template dishes/like, application/like with {:locale=>[:en], :formats=>[:js, "application/ecmascript", "application/x-ecmascript", :html, :text, :js, :css, :ics, :csv, :vcf, :png, :jpeg, :gif, :bmp, :tiff, :mpeg, :xml, :rss, :atom, :yaml, :multipart_form, :url_encoded_form, :json, :pdf, :zip], :variants=>[], :handlers=>[:erb, :builder, :raw, :ruby, :coffee, :jbuilder]}. Searched in:
  * "/app/views"
  * "/Library/Ruby/Gems/2.0.0/gems/devise-3.5.1/app/views"
):
  app/controllers/dishes_controller.rb:29:in `render_vote_partial'

请问您能否在控制台上发布您所获得的异常堆栈跟踪吗? - Shaunak
动作在渲染之前、之后或周围进行调用... 它不是渲染... 响应应该始终在行动中。 - Ruby Racer
True,尝试从around_action中进行渲染是不好的设计,但我正在努力理解它是否在技术上不允许。如果我现在可以访问我的开发机器来尝试它就好了。 - Shaunak
@Shaunak发布了控制台错误。基于Ruby Racer的评论,我是否不应该尝试简化我的控制器操作,而是将“respond_to”操作放在每个操作中? - Carl Edwards
@CarlEdwards 请检查我的答案,并更新一下,尝试解释一下你关于保持DRY的问题。 - Shaunak
@Shaunak,我在发布评论后看到了它。谢谢。 - Carl Edwards
1个回答

1

好的,通过你的堆栈跟踪信息,很明显发生了什么。你必须理解Rails默认的惯例优于配置的行为。

一旦你调用yield,你的控制器动作就会被调用。现在,默认情况下,所有控制器动作都会在执行完毕后查找与动作同名的视图进行呈现。

因此,在yield之后调用render_to没有任何意义,因为你“yielded to”的控制器动作已经调用了它自己的呈现操作 :)

不管怎样,你正在尝试做一种糟糕的设计模式,应将视图的呈现留给actions

更新

理论上来说:由于你想保持DRY,可以创建一个通用方法,在每个动作后调用该方法以呈现相同的视图。但是,请考虑一下,你的呈现操作只需要一行代码,而调用相同的方法也需要一行代码 :) 那么这样还有DRY吗?

简而言之,DRY不应过度追求简洁性。在我看来,KISSDRY更重要 :)


谢谢。那我是不是不用太担心保持DRY呢?我问这个问题是因为我有4个操作会渲染这个模板。 - Carl Edwards
1
通常情况下,您应该尽量保持DRY(Don't Repeat Yourself),但不要以简单为代价。KISS(保持简单原则)胜过DRY :) - Shaunak

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接