初始化索引动作演示者的方法

问题描述:

我想为Event索引动作制作演示者。初始化索引动作演示者的方法

这是它的样子。将会有更多的方法和东西添加到演示者和观点,但现在我只想得到这个工作:

class EventPresenter 

    def initialize(events, template) 
    @events = events 
    @template = template 
    end 

    def h 
    @template 
    end 

    def event_title 
    h.link_to event.name, event_path(event) 
    end 
end 

index.html.erb:

<% present @events do |event_presenter| %> <tr> 
    <td><%= event_presenter.event_title %></td> 
<% end %> 

应用助手:

module ApplicationHelper 
    def present(object, klass = nil) 
    klass ||= "#{object.class}Presenter".constantize 
    presenter = klass.new(object, self) 
    yield presenter if block_given? 
    presenter 
    end 
end 

events_controller:

def index 
    @events = Event.all.map{ |event| EventPresenter.new(event) } 
    # render json: @events 
    end 

现在的样子,我得到了演示者初始化方法的wrong number of arguments (1 for 2)错误。我是想看看这两个物体是没有得到通过移除或者@events@template,如传递到初始化:

def initialize(template) 
    @template = template 
    end 

但是,在这两种情况下在klass ||=线application_helper与应用程式的空档uninitialized constant ArrayPresenter,而它应该是寻找EventPresenter常数。

完全跟踪:

activesupport (5.0.0.beta3) lib/active_support/inflector/methods.rb:259:in `const_get' 
activesupport (5.0.0.beta3) lib/active_support/inflector/methods.rb:259:in `block in constantize' 
activesupport (5.0.0.beta3) lib/active_support/inflector/methods.rb:257:in `each' 
activesupport (5.0.0.beta3) lib/active_support/inflector/methods.rb:257:in `inject' 
activesupport (5.0.0.beta3) lib/active_support/inflector/methods.rb:257:in `constantize' 
activesupport (5.0.0.beta3) lib/active_support/core_ext/string/inflections.rb:66:in `constantize' 
app/helpers/application_helper.rb:3:in `present' 
app/views/events/index.html.erb:1:in `_app_views_events_index_html_erb__1682590753278671208_70298040094320' 
actionview (5.0.0.beta3) lib/action_view/template.rb:158:in `block in render' 
activesupport (5.0.0.beta3) lib/active_support/notifications.rb:166:in `instrument' 
actionview (5.0.0.beta3) lib/action_view/template.rb:348:in `instrument' 
actionview (5.0.0.beta3) lib/action_view/template.rb:156:in `render' 
actionview (5.0.0.beta3) lib/action_view/renderer/template_renderer.rb:54:in `block (2 levels) in render_template' 
actionview (5.0.0.beta3) lib/action_view/renderer/abstract_renderer.rb:42:in `block in instrument' 
activesupport (5.0.0.beta3) lib/active_support/notifications.rb:164:in `block in instrument' 
activesupport (5.0.0.beta3) lib/active_support/notifications/instrumenter.rb:21:in `instrument' 
activesupport (5.0.0.beta3) lib/active_support/notifications.rb:164:in `instrument' 
actionview (5.0.0.beta3) lib/action_view/renderer/abstract_renderer.rb:41:in `instrument' 
actionview (5.0.0.beta3) lib/action_view/renderer/template_renderer.rb:53:in `block in render_template' 
actionview (5.0.0.beta3) lib/action_view/renderer/template_renderer.rb:61:in `render_with_layout' 
actionview (5.0.0.beta3) lib/action_view/renderer/template_renderer.rb:52:in `render_template' 
actionview (5.0.0.beta3) lib/action_view/renderer/template_renderer.rb:14:in `render' 
actionview (5.0.0.beta3) lib/action_view/renderer/renderer.rb:42:in `render_template' 
actionview (5.0.0.beta3) lib/action_view/renderer/renderer.rb:23:in `render' 
actionview (5.0.0.beta3) lib/action_view/rendering.rb:103:in `_render_template' 
actionpack (5.0.0.beta3) lib/action_controller/metal/streaming.rb:217:in `_render_template' 
actionview (5.0.0.beta3) lib/action_view/rendering.rb:83:in `render_to_body' 
actionpack (5.0.0.beta3) lib/action_controller/metal/rendering.rb:52:in `render_to_body' 
actionpack (5.0.0.beta3) lib/action_controller/metal/renderers.rb:144:in `render_to_body' 
actionpack (5.0.0.beta3) lib/abstract_controller/rendering.rb:25:in `render' 
actionpack (5.0.0.beta3) lib/action_controller/metal/rendering.rb:36:in `render' 
actionpack (5.0.0.beta3) lib/action_controller/metal/instrumentation.rb:43:in `block (2 levels) in render' 
activesupport (5.0.0.beta3) lib/active_support/core_ext/benchmark.rb:12:in `block in ms' 
/usr/local/Cellar/ruby/2.2.3/lib/ruby/2.2.0/benchmark.rb:303:in `realtime' 
activesupport (5.0.0.beta3) lib/active_support/core_ext/benchmark.rb:12:in `ms' 
actionpack (5.0.0.beta3) lib/action_controller/metal/instrumentation.rb:43:in `block in render' 
actionpack (5.0.0.beta3) lib/action_controller/metal/instrumentation.rb:86:in `cleanup_view_runtime' 
activerecord (5.0.0.beta3) lib/active_record/railties/controller_runtime.rb:25:in `cleanup_view_runtime' 
actionpack (5.0.0.beta3) lib/action_controller/metal/instrumentation.rb:42:in `render' 
actionpack (5.0.0.beta3) lib/action_controller/metal/implicit_render.rb:19:in `default_render' 
actionpack (5.0.0.beta3) lib/action_controller/metal/basic_implicit_render.rb:4:in `block in send_action' 
actionpack (5.0.0.beta3) lib/action_controller/metal/basic_implicit_render.rb:4:in `tap' 
actionpack (5.0.0.beta3) lib/action_controller/metal/basic_implicit_render.rb:4:in `send_action' 
actionpack (5.0.0.beta3) lib/abstract_controller/base.rb:183:in `process_action' 
actionpack (5.0.0.beta3) lib/action_controller/metal/rendering.rb:30:in `process_action' 
actionpack (5.0.0.beta3) lib/abstract_controller/callbacks.rb:20:in `block in process_action' 
activesupport (5.0.0.beta3) lib/active_support/callbacks.rb:126:in `call' 
activesupport (5.0.0.beta3) lib/active_support/callbacks.rb:126:in `call' 
activesupport (5.0.0.beta3) lib/active_support/callbacks.rb:506:in `block (2 levels) in compile' 
activesupport (5.0.0.beta3) lib/active_support/callbacks.rb:455:in `call' 
activesupport (5.0.0.beta3) lib/active_support/callbacks.rb:455:in `call' 
activesupport (5.0.0.beta3) lib/active_support/callbacks.rb:101:in `__run_callbacks__' 
activesupport (5.0.0.beta3) lib/active_support/callbacks.rb:750:in `_run_process_action_callbacks' 
activesupport (5.0.0.beta3) lib/active_support/callbacks.rb:90:in `run_callbacks' 
actionpack (5.0.0.beta3) lib/abstract_controller/callbacks.rb:19:in `process_action' 
actionpack (5.0.0.beta3) lib/action_controller/metal/rescue.rb:27:in `process_action' 
actionpack (5.0.0.beta3) lib/action_controller/metal/instrumentation.rb:31:in `block in process_action' 
activesupport (5.0.0.beta3) lib/active_support/notifications.rb:164:in `block in instrument' 
activesupport (5.0.0.beta3) lib/active_support/notifications/instrumenter.rb:21:in `instrument' 
activesupport (5.0.0.beta3) lib/active_support/notifications.rb:164:in `instrument' 
actionpack (5.0.0.beta3) lib/action_controller/metal/instrumentation.rb:29:in `process_action' 
actionpack (5.0.0.beta3) lib/action_controller/metal/params_wrapper.rb:248:in `process_action' 
activerecord (5.0.0.beta3) lib/active_record/railties/controller_runtime.rb:18:in `process_action' 
actionpack (5.0.0.beta3) lib/abstract_controller/base.rb:128:in `process' 
actionview (5.0.0.beta3) lib/action_view/rendering.rb:30:in `process' 
actionpack (5.0.0.beta3) lib/action_controller/metal.rb:190:in `dispatch' 
actionpack (5.0.0.beta3) lib/action_controller/metal.rb:262:in `dispatch' 
actionpack (5.0.0.beta3) lib/action_dispatch/routing/route_set.rb:50:in `dispatch' 
actionpack (5.0.0.beta3) lib/action_dispatch/routing/route_set.rb:32:in `serve' 
actionpack (5.0.0.beta3) lib/action_dispatch/journey/router.rb:39:in `block in serve' 
actionpack (5.0.0.beta3) lib/action_dispatch/journey/router.rb:26:in `each' 
actionpack (5.0.0.beta3) lib/action_dispatch/journey/router.rb:26:in `serve' 
actionpack (5.0.0.beta3) lib/action_dispatch/routing/route_set.rb:724:in `call' 
actionview (5.0.0.beta3) lib/action_view/digestor.rb:12:in `call' 
rack (2.0.0.alpha) lib/rack/etag.rb:25:in `call' 
rack (2.0.0.alpha) lib/rack/conditional_get.rb:25:in `call' 
rack (2.0.0.alpha) lib/rack/head.rb:12:in `call' 
rack (2.0.0.alpha) lib/rack/session/abstract/id.rb:220:in `context' 
rack (2.0.0.alpha) lib/rack/session/abstract/id.rb:214:in `call' 
actionpack (5.0.0.beta3) lib/action_dispatch/middleware/cookies.rb:613:in `call' 
activerecord (5.0.0.beta3) lib/active_record/query_cache.rb:36:in `call' 
activerecord (5.0.0.beta3) lib/active_record/connection_adapters/abstract/connection_pool.rb:963:in `call' 
activerecord (5.0.0.beta3) lib/active_record/migration.rb:558:in `call' 
actionpack (5.0.0.beta3) lib/action_dispatch/middleware/callbacks.rb:29:in `block in call' 
activesupport (5.0.0.beta3) lib/active_support/callbacks.rb:97:in `__run_callbacks__' 
activesupport (5.0.0.beta3) lib/active_support/callbacks.rb:750:in `_run_call_callbacks' 
activesupport (5.0.0.beta3) lib/active_support/callbacks.rb:90:in `run_callbacks' 
actionpack (5.0.0.beta3) lib/action_dispatch/middleware/callbacks.rb:27:in `call' 
actionpack (5.0.0.beta3) lib/action_dispatch/middleware/reloader.rb:71:in `call' 
actionpack (5.0.0.beta3) lib/action_dispatch/middleware/remote_ip.rb:79:in `call' 
actionpack (5.0.0.beta3) lib/action_dispatch/middleware/debug_exceptions.rb:49:in `call' 
web-console (3.1.1) lib/web_console/middleware.rb:131:in `call_app' 
web-console (3.1.1) lib/web_console/middleware.rb:28:in `block in call' 
web-console (3.1.1) lib/web_console/middleware.rb:18:in `catch' 
web-console (3.1.1) lib/web_console/middleware.rb:18:in `call' 
actionpack (5.0.0.beta3) lib/action_dispatch/middleware/show_exceptions.rb:31:in `call' 
railties (5.0.0.beta3) lib/rails/rack/logger.rb:36:in `call_app' 
railties (5.0.0.beta3) lib/rails/rack/logger.rb:24:in `block in call' 
activesupport (5.0.0.beta3) lib/active_support/tagged_logging.rb:70:in `block in tagged' 
activesupport (5.0.0.beta3) lib/active_support/tagged_logging.rb:26:in `tagged' 
activesupport (5.0.0.beta3) lib/active_support/tagged_logging.rb:70:in `tagged' 
railties (5.0.0.beta3) lib/rails/rack/logger.rb:24:in `call' 
actionpack (5.0.0.beta3) lib/action_dispatch/middleware/request_id.rb:24:in `call' 
rack (2.0.0.alpha) lib/rack/method_override.rb:22:in `call' 
rack (2.0.0.alpha) lib/rack/runtime.rb:22:in `call' 
activesupport (5.0.0.beta3) lib/active_support/cache/strategy/local_cache_middleware.rb:28:in `call' 
actionpack (5.0.0.beta3) lib/action_dispatch/middleware/load_interlock.rb:13:in `call' 
actionpack (5.0.0.beta3) lib/action_dispatch/middleware/static.rb:136:in `call' 
rack (2.0.0.alpha) lib/rack/sendfile.rb:111:in `call' 
railties (5.0.0.beta3) lib/rails/engine.rb:522:in `call' 
puma (3.4.0) lib/puma/configuration.rb:224:in `call' 
puma (3.4.0) lib/puma/server.rb:569:in `handle_request' 
puma (3.4.0) lib/puma/server.rb:406:in `process_client' 
puma (3.4.0) lib/puma/server.rb:271:in `block in run' 
puma (3.4.0) lib/puma/thread_pool.rb:114:in `call' 
puma (3.4.0) lib/puma/thread_pool.rb:114:in `block in spawn_thread' 
+0

你可以发布堆栈跟踪吗? –

+0

当然,我只是更新了文章 – sivanes

你似乎通过调用视图层present方法,这样做同样的事情在控制器来包装event对象与主持人看起来多余的给我。此外,实际上这是一条导致wrong number of arguments的行,因为您只用一个参数包装它。让我们删除它:

# events_controller 
def index 
    @events = Event.all 
    # we removed redundant EventPresenter.new(event) here 
end 

下一步是您的视图模板。只要@events包含一组元素(您可以在present帮助程序方法中检查object参数的类别),则得到"#{object.class}Presenter".constantize"ArrayPresenter".constantize结束,并且由于没有ArrayPresenter这样的类别,因此会导致错误。你可以在这里做解决什么这是第一次迭代的数组:

<% @events.each do |event| %> 
    <% present event do |event_presenter| %> 

另一种选择可能是重复你的助手方法内的集合。您可能会对Draper宝石等现有解决方案感兴趣,以了解它们如何解决对象封装问题。

+0

好吧,终于有了这个尝试。这一切都是有道理的,除了我应该在EventPresenter文件中更改什么?该应用程序在' sivanes

+0

@sivanes在该方法中没有像'event'这样的局部变量,所以错误似乎是合法的。你只有'@ events'数组。更重要的是,你将会遇到从演示者类调用'h'的问题(因为那里没有定义帮助器)。并且初始化程序中的'template'参数是一个保留的rails字,所以你应该重命名它。请注意演示者是高级话题,您应该准备好解决这些问题。 – twonegatives

+0

所以,在这里没有快速解决,我拿? – sivanes