0

タスク/タスクを検出してビューに渡すことを目的としたコントローラーの懸念があります。

私のアプリケーション レイアウトには、これらのタスクをレンダリングするためのスペースが確保されています

<%= yield(:tasks) if content_for?(:tasks) %>

これが、ApplicationController に含めるモジュールです。正しく動作していないようで、content_for?(:tasks)false が返されます (byebug によると)

module TaskControl
  extend ActiveSupport::Concern

  included do
    before_action :check_tasks

    def check_tasks
      if user_signed_in? and current_user.tasks.todos.any?
        # TODO : better task strategy afterwards
        view_context.provide(:tasks, 
          view_context.cell(:tasks, current_user.tasks.todos.first)
        )
      end
      view_context.content_for?(:tasks) # => false :'(
    end
  end
end

byebugで確認したことに注意してください。

view_context.cell(:tasks, current_user.tasks.todos.first).blank? # => false, so there is something to render
4

1 に答える 1

1

ビューがどのように機能するかについて、コントローラーが責任を負う必要がありますか? 私はノーと言うでしょう。

module/concern を使用してクエリ部分を DRY アップすることは理にかなっていますが、yield ブロックのコンテンツを提供することは意味がありません。コントローラーは、ビューがどのように構築されるかについての知識を持っていてはなりません。

代わりに、次のようにレイアウトを構成することができます。

<body>
  <%= yield :tasks %>
  <%= yield %>

  <% if @tasks %>
  <div id="tasks">
  <%= content_for(:tasks) do %>
    <%= render partial: 'tasks' %>
  <% end %>
  </div>
  <% end %>
</body>

これにより、コントローラーはデータを提供することでどのタスクを設定できるようになり、ビューはcontent_forまたはprovideを使用してプレゼンテーションを変更できるようになります。

<% # app/views/foo/bar.html.erb %>
<%= provide(:tasks) do %>
  <% # this overrides anything provided by default %>
  <ul>
     <li>Water cat</li>
     <li>Feed plants</li>
  </ul>
<% end %>
于 2016-04-30T17:22:26.860 に答える