如何从另一个控制器访问实例变量?

时间:2010-11-14 07:19:20

标签: ruby-on-rails-3

所以我有两个型号和控制器。项目和设计师。

在我的设计师索引视图中,我希望它显示设计师所有项目的列表。

但是,当我这样做一个简单的查询时:

<% @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 %>

在Designers视图中的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

但是,当我在项目视图中的index.html.erb文件中运行那个EXACT代码时,它可以很好地工作。

那么我如何能够访问该控制器或至少从另一个控制器的视图中访问数据?我是否必须在我的设计器控制器中添加一个项目变量(它在哪里查询数据库)到我的索引对象?

感谢。

3 个答案:

答案 0 :(得分:4)

更新使用单一设计师纪录

你应该使用关联。将其添加到您的模型中。

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 :(得分:1)

找出一种方法。我所要做的就是在设计器控制器中添加一个实例变量:

@projects = Project.all

但是......那不是很干。有没有人有更优雅的'干'解决方案,所以如果我想访问其他控制器中的其他变量,我可以轻松地做到这一点,而无需在当前控制器中重新创建它们?

感谢。

答案 2 :(得分:0)

在您的designer控制器中,您需要将@projects实例变量设置为仅属于已登录设计器的项目,对吗?

你需要这样的东西:

def index

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

end

我希望这会有所帮助。