2016-06-17 30 views
0

我想爲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

回答

0

你似乎通過調用視圖層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