【问题标题】:Extra instance variable in controller is nil in view?控制器中的额外实例变量在视图中为零?
【发布时间】:2012-04-23 05:46:51
【问题描述】:

我已经在 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,但我现在将它们分开,以便在元素通过时检查它们。

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

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

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

<%= @stars.inspect %>

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

return render @stars.each

我看到变量填充了来自 Star.where() 的正确星形对象,正如我所期望的那样。快速 .inspect 显示变量在控制器中时不为零。

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

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

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

【问题讨论】:

  • 好吧,你当然不想要 ;那是错字吗?此外,当tempstr 已经是一个字符串时,"#{tempstr}" 有点多余。如果你在控制器中记录或pry @stars 真的包含值吗?
  • @Dave Newton - 首先,感谢您关注 tempstr;我原本打算用 rails 语法来做 .where ,这需要评估。对于 2,其中的 = 有错字,我会在问题中解决这个问题,再次感谢。对于 3,使用logger.debug 输出@stars.each do |star| star.ra end(其中star.ra 是星变量之一)似乎记录了@stars 的全部内容,其中包括.where 应该的2 星的所有变量找到。我认为这意味着它确实包含值,尽管我想它可能是从其他地方获取的?

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


【解决方案1】:

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

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

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

【讨论】:

  • 是的,你完全正确!在您发布之前不久,我自己才弄清楚,但非常感谢您的回答和确认!我原本以为 Show 页面在从那里初始化时会自动使用 Create 方法,但我错了。这么简单的一个错误让我花了好几个小时煮我的大脑。
  • 你的回答帮助我解决了完全不相关的 Rails 问题。你值得拥有:D
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-13
  • 1970-01-01
  • 1970-01-01
  • 2012-01-21
  • 2010-11-27
  • 1970-01-01
相关资源
最近更新 更多