0

私は、タスク/トードを検出してビューに渡すことを目的としたコントローラーに関する懸念があります。私はここでは、それらのタスクコントローラーでの表示内容の提供

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

をレンダリングするために予約されたスペースを持っている私のアプリケーションのレイアウトで

は、私はApplicationControllerにに含めるモジュールです。私が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 

注意、

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

答えて

1

コントローラがビューがありませんどのように責任を負わなければならない適切に動作するように見えるとcontent_for?(:tasks) falseを返します(byebug言います)はありませんジョブ?私はいいえと言うだろう。

モジュール/懸念事項を使用してクエリ部分をDRYし、yieldブロックのコンテンツを提供しないことは理にかなっています。あなたのコントローラは、ビューがどのように構築されているかについて知るべきではありません。

代わりに、あなたはそうのようなレイアウトを構築することもできます。

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

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

これは、データを提供することにより、どのタスクコントローラのセットをすることができます - そして、あなたの意見はcontent_for or 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 %> 
関連する問題