Ошибка пути к шаблону в Presenter (ActionView :: Template :: Error (Отсутствует частичное ...) - PullRequest
0 голосов
/ 23 сентября 2019

Я переместил свой помощник render_listable в презентатор, и теперь мой путь рендеринга неверен, так как метод рендеринга не может видеть шаблон.

Как исправить путь к пути шаблона?

Ошибка

ActionView :: Template :: Error (Отсутствует частичный поиск / _listing_car с {: locale)=> [: en],: format => [: html,: text,: js,: css,: ics,: csv,: vcf,: vtt,: png,: jpeg,: gif,: bmp,: tiff,: svg,: mpeg,: mp3,: ogg,: m4a,: webm,: mp4,: otf,: ttf,: woff,: woff2,: xml,: rss,: atom,: yaml,: multipart_form,:url_encoded_form,: json,: pdf,: zip,: gzip],: варианты => [],: обработчики => [: raw,: erb,: html,: builder,: ruby,: coffee,: jbuilder]}.Поиск в:):

>     3:     <div class="col-md-12 vertical-right">
>     4:            <% if listings && listings.size > 0 %>
>     5:                <% listings.each do |listing_object| %>
>     6:           <%= listing_object.render_listable %>
>     7:                    <hr/>
>     8:                <% end %>
>     9:
> 

app / Presenters / list_presenter.rb: 60: в render_listable' app/views/search/_searchresults.html.erb:6:in блоке в _app_views_search__searchresults_html_erb___9192204423298974_70140171600340 'app.res.res.res.res.res.resh.resh/er_views.resh /5: в each' app/views/search/_searchresults.html.erb:5:in _app_views_search__searchresults_html_erb ___ 919234423298974_70140171600340' приложение / просмотров / поиск / index.js.erb: 3: в `_app_views_search_index_js_erb ___ 2514407173266410_70140171518260'

Мои шаблоны в ..

1019 * MyAppName / приложение/ VIews / search / _listing_car.html.erb MyAppName / app / views / search / _listing_truck.html.erb

Presenter

class ListingPresenter < ApplicationPresenter

  def render_listable
    case listable_type
    when "Car"
      h.render partial: "search/listing_car", locals: { listing: self }
    when "Truck"
      h.render partial: "search/listing_truck", locals: { listing: self }
    else
      "NO TEMPLATE RENDERED"
    end
  end
end

Приложение Presenter

class ApplicationPresenter
  delegate_missing_to :@object


  def initialize(object)
    @object = object
  end

  def h
    ActionController::Base.helpers
  end

  def routes
    Rails.application.routes.url_helpers
  end 

  def self.present(obj, presenter_class = nil)
    klass = presenter_class || presenter_name(obj).constantize
    klass.new obj 
  end

  def self.wrap_collection(collection)
    collection.map { |obj| self.present(obj) }
  end

  private

  def self.presenter_name(model)
    if model.class == Listing
      "#{model.listable_type}Presenter"
    else
      "#{model.class}Presenter"
    end
  end
end

Примечание:

Я заметил, что если я передаю viewcontext, а не использую метод ActionController :: Base.helpers (метод h), он работает.

Однако я бы предпочел не передавать view_context.

  def render_listable(view_context)
    case listable_type
    when "Car"
      view_context.render partial: "search/listing_car", locals: { listing: self }
    when "Truck"
      view_context.render partial: "search/listing_truck", locals: { listing: self }
    else
      "NO TEMPLATE RENDERED"
    end
  end

Поэтому, когда я звоню из вида ..

listing.listable_type(self),

но я хочу

listing.listable_type

...