0

谁能想到控制器中声明的实例变量不会被其视图识别的原因?

控制器看起来像这样:

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。

- 奇怪的是: <%= @user.xxxx %> 得到正确格式化和显示,而带有 <%= @question.xxx %> 的任何东西都没有。

- 这是更奇怪的事情。如果我在控制器中注释掉 @user 记录仍然正确显示在视图中,所以它实际上忽略了控制器中的内容(但我不知道为什么)

- 是的,我已经检查过我正在查看正确的控制器和查看器。

4

4 回答 4

1

你确定 session[:profilequestioncapture] 不为零吗?

于 2013-02-01T15:34:22.067 回答
0

@question是一个ActiveRecord::Relation对象。除非你调用.first它,否则当你尝试调用它的一些问题属性时你会遇到错误。如果如其中一个答案所述,这session[:profilequestioncapture]也是 nil

于 2013-02-01T15:38:13.557 回答
0

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

于 2013-02-02T12:58:59.963 回答
0

首先,我认为 where 范围会给你一个 ActiveRecord::Relation (它给出一个数组),而不是一个记录。既然您想通过 id 查找,我建议

Question.find(session[:profilequestioncapture])

很可能您会想要挽救 ActiveRecord::NotFound 异常并设置默认问题或更改行为。

您使用的是 Draper 还是 Presenters?你能仔细检查你的@question 是否真的有数据?

至于您的 @user 背后填充即使注释掉:

  • 检查缓存问题
  • 检查可以为您填充它的 before_filter 操作。
于 2013-02-01T15:45:15.087 回答