控制器中的额外实例变量是否为零?

时间:2012-04-10 22:07:55

标签: ruby-on-rails model-view-controller view

我一直在搜索Stack Overflow几个小时,但没有相关的问题似乎适用于我的问题。

我是Rails的新手,这是我的第一个真正的项目,我可能会稍微混淆MVC设置。我试图在searching_controller.rb的一个动作中分配@stars实例变量:

def create
  @search = Search.new(params[:search])
  tempstr = searchstr(@search)
  @stars = Star.where("tempstr", :limit => 100)
end

@search创建得很好,是一个具有不同参数的复杂搜索。 tempstr只是searchstr(@search)结果的简单字符串容器,这是一种将搜索参数转换为MySql相关字符串的快速方法(这似乎比尝试使用.where更容易)通常是帮手,在这种情况下)。我确信我可以直接将searchstr(@search)放入.where,但我现在将它们分开,这样我就可以在元素通过时检查它们。

无论如何,当我尝试在show.html.erb视图中调用@stars时会出现此问题。即使有这样简单的事情:

<% @stars.each do |star| %>
  <%= display stuff %>
<% end %>

我收到错误'each' is not a method of nil:NilClass。所以,我将其更改为以下内容,以查看@stars是否为nil:

<%= @stars.inspect %>

果然,@starsnil。但是,当我将此行添加到我的控制器以检查@stars时:

return render @stars.each

我看到变量是用Star.where()中正确的星形对象填充的,就像我想要的那样。快速.inspect显示变量在控制器中不是nil。

所以,我不确定为什么视图接收它为nil,如果已在控制器中定义就好了。不过,如果我误解了MVC是如何工作的,我也不会感到惊讶。 Star类是在Star模型中定义的,但也许是因为我试图从Searches控制器访问它,因此它没有为视图初始化?

我应该以其他方式做这件事吗?我尝试使用局部变量(使用stars而不是@stars),但随后视图显示“未定义的局部变量或方法'星''。

任何帮助都会非常感激,我已经把我的大脑搞砸了几个小时创建复杂的搜索并将星文件数据解析到数据库中,所以我有点烦躁。如果需要,我可以提供更多信息,我不确定在提供答案方面还有什么帮助。

1 个答案:

答案 0 :(得分:3)

您在@stars方法中设置create,但您正在谈论的视图是show.html.erb。尝试在@stars方法中设置show。像这样:

def show
  @search = Search.find(params[:id])
  tempstr = searchstr(@search)
  @stars = Star.where("tempstr", :limit => 100)
end

如果这对您没有帮助,请向其他人展示控制器操作,以便我们为您提供更好的帮助。