Я переместил свой помощник 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