5

我已经通过 Stack Overflow 搜索了几个小时,但似乎没有一个相关问题适用于我的问题。

我是 Rails 新手,这是我第一个真正的项目,我可能会对 MVC 设置感到困惑。我试图在 search_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,但我现在将它们分开,以便在元素通过时检查它们。

无论如何,当我尝试调用@starsshow.html.erb 视图时,问题就出现了。即使是这样简单的事情:

<% @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。不过,如果是我误解了 MVC 的工作原理,我不会感到惊讶。Star 类是在 Star 模型中定义的,但也许是因为我试图从 Searches 控制器访问它,因此它没有为视图初始化?

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

任何帮助将不胜感激,我已经花了好几个小时来创建复杂的搜索并将星文件数据解析到数据库中,所以我有点筋疲力尽。如果需要,我可以提供更多信息,我不确定还有什么有助于提供答案。

4

1 回答 1

3

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

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

如果这对您没有帮助,请向您展示其余的控制器操作,以便我们可以更好地帮助您。

于 2012-04-11T04:34:26.317 回答