实例变量未被其视图识别

时间:2013-02-01 15:26:19

标签: ruby-on-rails view controller instance-variables ignore

有人能想到控制器中声明的实例变量无法被其视图识别的原因吗?

控制器看起来像这样:

class UsersController < ApplicationController

...
def show

@questionshow = session[:profilequestioncapture]
@user = User.find(params[:id])
@question = Question.where("id = ?", @questionshow).first
...

视图:(用户目录中的show.html.erb:)

...
<dl class="dl-horizontal">

    <dt>Headline</dt>
    <dt>Description</dt>
    <dt>Budget</dt> 

    <dd><%= @question.headline %></dd>
    <dd><%= @question.description %></dd>
    <dd><%= @question.currency %>&nbsp<%= @question.budget %></dd>

</dl>
....

- 会话正确填充@questionshow实例变量。它只包含id,并且正确传递给@question。

- 有什么奇怪的:&lt;%= @ user.xxxx%&gt;获得正确的格式和显示,而任何与&lt;%= @ question.xxx%&gt;没有。

- 这就是更奇怪的东西。如果我在控制器中注释掉@user,那么记录仍会在视图中正确显示,所以它实际上忽略了控制器中的内容(但我无法弄清楚原因)

- 是的我已经检查过我正在寻找合适的控制器&amp;观看者。

我很难过!

4 个答案:

答案 0 :(得分:1)

您确定会话[:profilequestioncapture]不是nil吗?

答案 1 :(得分:0)

@questionActiveRecord::Relation个对象。除非您在其上调用.first,否则当您尝试向其调用某些问题属性时,您将遇到错误。如果其中一个答案所述session[:profilequestioncapture]为零

,那也是如此

答案 2 :(得分:0)

首先我认为where scope会给你一个ActiveRecord :: Relation(它给出一个数组),而不是一个记录。因为你想通过id找到我会建议

Question.find(session[:profilequestioncapture])

很可能您需要解除ActiveRecord :: NotFound异常并设置默认问题或更改行为。

您使用的是Draper还是Presenters? 你能仔细检查你的@question实际上有数据吗?

至于你的@user背后填充即使被注释掉了:

  • 检查缓存问题
  • 检查可以为您填充的before_filter操作。

答案 3 :(得分:0)

我找到了解决方案,但这让我有点困惑。我没有在同一个控制器中的所有操作中定义附加到我的Questions模型的相同实例变量。所以在Show中是@question而在Create中它是(例如)@yyyquestion,在Update中我使用了其他东西(例如@yyyquestion)。我不知道为什么这会导致错误以及为什么实例变量将填充在控制器中而不是在视图中。我想这个故事还有更多......