2012-04-10 59 views
5

我一直在通过Stack Overflow搜索几个小时,但没有一个相关的问题似乎适用于我的问题。控制器中的额外实例变量是否为零?

我是Rails的新手,这是我第一个真正的项目,我可能会混淆MVC设置。我试图给@stars实例变量赋值,而在searches_controller.rb的动作:

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是零:

<%= @stars.inspect %> 

果然,@starsnil。然而,当我这行添加到我的控制器检查@stars有:

return render @stars.each 

我看到变量充满了从Star.where(正确的星空对象),就像我本来打算。一个快速的.inspect显示在控制器中变量不是零。

所以,我不确定为什么视图接收它为零,如果它已经在控制器中定义好了。不过,如果我误解MVC的工作原理,我不会感到惊讶。 Star类是在Star模型中定义的,但也许是因为我试图从搜索控制器访问它,因此它未针对视图进行初始化?

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

任何帮助将不胜感激,我已经伤了几个小时创建复杂的搜索和解析星形文件数据到数据库中,所以我有点被烧毁。如果需要,我可以提供更多信息,但我不确定还有什么可以帮助提供答案。

+0

嗯,你当然不想要<%= @ stars.each%>;是一个错字?另外,当tempstr已经是一个字符串时''#{tempstr}“'有点多余。如果您在控制器中记录或撬动'@ stars'确实包含值? – 2012-04-10 22:53:34

+0

@Dave Newton - 首先感谢捕捉tempstr;我原本打算使用rails语法来完成这个任务,这需要进行评估。对于2,那里有一个错字,我会在问题中解决这个问题,再次感谢。对于3,使用'logger.debug'输出'@stars.each do | star | star.ra end'(其中'star.ra'是其中一个星号变量)似乎已经记录了@stars的全部内容,其中包括.where应该找到的2星的所有变量。我认为这意味着它确实包含价值观,尽管它可以从其他地方获得它,我想呢? – Xadera 2012-04-10 23:45:32

回答

3

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

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

如果不帮你,请出示你休息控制器动作,所以我们可以帮助你更好。

+0

是的,你绝对正确!在发布之前不久,我就已经知道了自己的想法,但非常感谢您的回答和确认!我原本以为显示页面从那里初始化时会自动使用Create方法,但我错了。这样一个简单的错误让我花上好几个小时煮我的大脑。 – Xadera 2012-04-11 07:14:26

+0

你的回答帮助我解决了完全不相关的导轨问题。你值得上升:D – kubbing 2013-08-26 23:03:48

相关问题