Użycie funkcji z kontrolera w layouts

Witam.
Podzieliłem sobie stronkę na layouty. W _sidebar.html potrzebuję pobrać listę z bazy danych. Chciałem zrobić to w taki sposób.

<ul class="nav nav-list">
                <% @project_strong.each do |project_strong| %>
                    <li><a href="#"><%= project_strong.name %></a></li>
                <% end %>

I niestety ta funkcja działa, jeżeli otwarta podstrona to ta, która używa funkcji z tego kontrolera, a niestety gdy wejdę na inną postronę to kontroler się zmienia, a więc i @project_strong znika. Pomimo tego, chcę aby w sidebar była renderowana lista projektów z bazy danych.
Error: NoMethodError in IndexPage#index - undefined method ‘each’ for nil:NilClass

Pewnie bardzo łatwo to zrobić, a ja niestety początkujący.
Pozdrawiam.

Odpisując na szybko:

Możesz wrzucić before_filter w nadrzędnym kontrolerze i w nim załadować @project_strong (btw - czy to nie powinna być nazwa kolekcji?) - czyli np w application_controller.rb

Mógłbyś też użyć Cells - https://github.com/apotonick/cells - co jest dużo lepszym rozwiązaniem

Są też gemy do tworzenia takich list menusowych: https://www.ruby-toolbox.com/categories/rails_menu_builders

Warto tez znac: http://guides.rubyonrails.org/layouts_and_rendering.html#using-the-content-for-method

A jak to osiągnąć na razie bez użycia gema ?
controllers/application_controller.rb

class ApplicationController < ActionController::Base
  protect_from_forgery with: :exception
 #jak zaladowac @project_strong
  def listProjects
    @project_lists = ProjectStrong.all
  end

end

layouts/_sidebar.html.erb

<ul class="nav nav-list">
                <% @project_lists.each do |project_strong| %>
                    <li><a href="#"><%= project_strong.name %></a></li>
                <% end %>
              </ul>

Czy gdy wy macie podobną sytuację, to zawsze używacie do tego np.: tego gema Cells ? Czy w ogóle osiąga się to jeszcze inaczej.
Pozdrawiam.

Ja bym to wrzucił do helpera

W najbardziej prostacki sposób to dodaj tak jak Ci pisali powyżej before_filter.

class ApplicationController < ActionController::Base
  protect_from_forgery with: :exception
  before_filter :listProjects

  def listProjects
    @project_lists = ProjectStrong.all
  end
end

Jednak to bardziej pasuje do helpera.

Mała uwaga - nie używaj instance variable w partialach.

OK. Też tak myślałem żeby to dodać do helpera. Ale zastanawiało nie jedno: kiedy dawać do helpera a kiedy do controlera? Operacje na bazie danych do controlera a inne pomocne rzeczy do helpera czy jak to odróżniać ?

W takim wypadku czego mam używać, żeby zrobić iteracje tej listy w sidebar ? (od razu chciałbym się uczyć dobrych praktyk).
Pozdrawam

Spróbuj zrobić na zasadzie:

class ApplicationController < ActionController::Base
  .
  .
  .
  helper_method :moja_metoda

  def moja_metoda
    #kod metody
  end
end

I potem wywoływać ją w dowolnym widoku html.erb:

<%= moja_metoda %>

Bądź w widoku html.haml

= moja_metoda