4

Я отрисовка частица js.erb, которая позволяет функции ajax любить/не нравится блюдо в ресторане. Недавно я столкнулся с обратным вызовом around_action, и фигура yield помогла бы сначала выполнить действие контроллера и отобразить второй. К сожалению, я получаю 500 (Internal Server Error) из-за того, что respond_to никогда не будет вызван.Предоставление вида действия контроллера из обратного вызова around_action

Метод 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 

Console Ошибка

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' 
+0

Вы можете отправить сообщение об ошибке стека исключений, которое вы получите на консоли, пожалуйста? – Shaunak

+0

Действие вызывается до, после или вокруг рендеринга ... Это не рендеринг ... Ответы всегда должны быть в действиях. –

+0

Правда, попытка сделать из around_action плохая конструкция, однако я пытаюсь понять, если технически это запрещено. Который я имел доступ к моей машине dev прямо сейчас, чтобы попробовать. – Shaunak

ответ

1

Хорошо так с вашего стека проследить это довольно ясно, что происходит. Вы должны понимать поведение рельсов по умолчанию по сравнению с конфигурацией.

Как только вы вызываете yield, вы вызываете действие вашего контроллера. Теперь все действия контроллера по умолчанию выглядят для визуализации представлений с тем же именем, что и действие, после выполнения действий.

Так вызова render_to после yield не имеет никакого смысла, так как действие контроллера вы уступал уже называют его делают :)

В любом случае то, что вы пытаетесь сделать, это плохой шаблон дизайна, вид рендеринга следует оставить на actions

Update

Теоретически говоря: Как йо u хотите сохранить вещи DRY, вы можете отобразить один и тот же вид после каждого действия, создав общий метод, вызывающий его после каждого действия. Однако подумайте об этом, ваш рендер будет иметь одну строку, и для вызова этого же метода понадобится одна строка :), так где DRY.

Одним словом, СУХОЙ не следует делать за счет простоты. На мой взгляд KISS козыри DRY :)

+0

Спасибо. Так не стоит ли мне так беспокоиться о том, чтобы держать вещи сухими? Причина, о которой я прошу, состоит в том, что у меня есть 4 действия, которые отображают этот шаблон. –

+1

обычно вы должны стараться держать вещи сухими, но не ценой простоты. KISS козыри DRY :) – Shaunak

Смежные вопросы