我正在渲染一个js.erb部分,它使ajax功能能够喜欢/不喜欢餐馆菜肴。我最近遇到了around_action
回调,并认为yield
将首先帮助执行控制器操作并将模板呈现为第二个。不幸的是,由于500 (Internal Server Error)
永远不会被调用,我收到respond_to
。
如果我将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'
控制台错误
top_sequence_driver_u
答案 0 :(得分:1)
好的,你的堆栈跟踪很清楚发生了什么。您必须了解约定优于配置的默认rails行为。
一旦调用yield
,您的控制器操作就会被调用。现在,一旦执行了操作,默认情况下所有控制器操作都会查找与操作同名的视图。
因此render_to
之后调用yield
没有任何意义,因为屈服于的控制器操作已经调用了它的渲染:)
在任何情况下,您要做的是一个糟糕的设计模式,渲染视图应留给actions
更新
从理论上讲:由于你希望保持干燥,你可以在每个动作之后通过创建一个在每个动作之后调用它的公共方法来呈现相同的视图。但是,考虑一下,你的渲染将有一行,并且调用相同的方法也需要一行:)所以在哪里干了。
简而言之,DRY不应该以简单为代价完成。在我看来, KISS 胜过 DRY :)