gpt4 book ai didi

ruby-on-rails - 从 around_action 回调渲染 Controller Action 的 View

转载 作者:行者123 更新时间:2023-12-01 05:02:16 24 4
gpt4 key购买 nike

我正在渲染一个 js.erb 部分,它使 ajax 功能可以喜欢/不喜欢餐厅菜肴。我最近遇到了 around_action回调和计算 yield将有助于首先执行 Controller 操作,然后再渲染模板。不幸的是,我收到了 500 (Internal Server Error)由于 respond_to永远不会被调用。
respond_to如果我将它放在 Controller 操作中但不在回调中,则方法有效。我究竟做错了什么?

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 ,您的 Controller 操作被调用。现在,一旦操作完成执行,默认情况下所有 Controller 操作都将呈现与操作同名的 View 。

所以打电话render_toyield没有任何意义,因为你屈服的 Controller Action 已经调用了它的渲染:)

在任何情况下,您尝试做的是一个糟糕的设计模式,渲染 View 应该留给 actions

Update



从理论上讲:如果您希望保持 DRY,您可以在每个操作后通过创建一个在每个操作后调用它的通用方法来呈现相同的 View 。但是,想想看,您的渲染将只有一行,调用相同的方法也需要一行 :) 那么 DRY 在哪里。

简而言之,DRY 不应以牺牲简单性为代价。在我看来 王牌 :)

关于ruby-on-rails - 从 around_action 回调渲染 Controller Action 的 View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31858077/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com