Как мне получить доступ к переменной экземпляра с другого контроллера? - PullRequest
1 голос
/ 14 ноября 2010

Итак, у меня есть две модели и контроллеры.Проекты и дизайнеры.

В моем представлении индекса дизайнеров я хочу, чтобы он отображал список всех проектов, которые есть у дизайнера.

Однако, когда я делаю простой запрос, подобный этому:

<% @projects.each do |project| %>
  <tr>
    <td><%= link_to 'Show', project %></td>
    <td><%= link_to 'Edit', edit_project_path(project) %></td>
    <td><%= link_to 'Destroy', project, :confirm => 'Are you sure?', :method => :delete %></td>
  </tr>
<% end %>

Из index.html.erb в представлении «Дизайнеры» выдается следующая ошибка:

NoMethodError in Designers#index
You have a nil object when you didn't expect it!
You might have expected an instance of Array.
The error occurred while evaluating nil.each

Однако, когда я запускаю этот EXACT-код из index.html.файл erb в представлении проектов, он отлично работает.

Итак, как я могу получить доступ к этому контроллеру или, по крайней мере, к данным из представления другого контроллера?Нужно ли добавлять переменную проектов (где она запрашивает БД) в мой индексный объект в контроллере дизайнеров?

Спасибо.

Ответы [ 3 ]

4 голосов
/ 14 ноября 2010

ОБНОВЛЕНО ДЛЯ ИСПОЛЬЗОВАНИЯ ОДНОГО ЗАПИСИ ДИЗАЙНЕРА

Вы должны использовать ассоциации. Добавьте это к своим моделям.

class Designer < ActiveRecord::Base
  has_many :projects
end

class Project < ActiveRecord::Base
  belongs_to :designer
end

Ваш взгляд должен выглядеть следующим образом:

<% @designer.projects.each do |project| %>  

<% end %>

Больше информации об ассоциациях здесь: http://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html

1 голос
/ 14 ноября 2010

Придумал один способ сделать это. Все, что мне нужно было сделать, это добавить переменную экземпляра в мой контроллер дизайнеров:

@projects = Project.all

Но ... это не очень СУХОЙ. У кого-нибудь есть более элегантное «СУХОЕ» решение, поэтому, если я хочу получить доступ к другим переменным в других контроллерах, я могу сделать это легко, не создавая их заново в текущем контроллере?

Спасибо.

0 голосов
/ 18 апреля 2011

В контроллере дизайнеров вам нужно установить переменную экземпляра @projects только для тех проектов, которые принадлежат зарегистрированному конструктору, верно?

Вам понадобится что-то вроде этого:

def index

  @projects = Project.where(:user_id => where ever you've stored your userid) 

end

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...