加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ruby-on-rails – 从around_action回调中渲染控制器操作的视图

发布时间:2020-12-17 02:08:20 所属栏目:百科 来源:网络整理
导读:我正在渲染一个js.erb部分,它使ajax功能能够喜欢/不喜欢餐馆的菜肴.我最近遇到了around_action回调,并且计算yield会帮助首先执行控制器操作并将模板呈现为第二个.不幸的是,由于respond_to永远不会被调用,我得到500(内部服务器错误). 如果我将其置于控制器操
我正在渲染一个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'

解决方法

好的,你的堆栈跟踪很清楚发生了什么.您必须了解约定优于配置的默认rails行为.

一旦调用yield,就会调用控制器操作.现在,一旦执行了操作,默认情况下所有控制器操作都会查找与操作同名的视图.

所以在yield之后调用render_to没有任何意义,因为你已经调用的控制器操作已经调用了它的渲染:)

在任何情况下,您要做的是一个糟糕的设计模式,渲染视图应留给操作

Update

从理论上讲:由于你希望保持干燥,你可以在每个动作之后通过创建一个在每个动作之后调用它的公共方法来呈现相同的视图.但是,考虑一下,你的渲染将有一行,并且调用相同的方法也需要一行:)所以DRY在哪里.

简而言之,DRY不应该以简单为代价完成.在我看来,KISS胜过DRY

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读