Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 在视图上使用之前,Rails强制实例变量声明_Ruby On Rails_Ruby - Fatal编程技术网

Ruby on rails 在视图上使用之前,Rails强制实例变量声明

Ruby on rails 在视图上使用之前,Rails强制实例变量声明,ruby-on-rails,ruby,Ruby On Rails,Ruby,在控制器上未定义的视图上打印/使用实例变量时,是否可能强制Ruby/Rails抛出错误 我在Rails控制器上声明一个实例变量,并在视图上打印它的值 def controller_action @some_data = "some value" end 然后我们知道我们可以在视图上打印它的值 <p>Some data has <%= @some_data %></p> 某些数据已丢失 我的问题是,在这样一个视图上犯错误时: <p>So

在控制器上未定义的视图上打印/使用实例变量时,是否可能强制Ruby/Rails抛出错误

我在Rails控制器上声明一个实例变量,并在视图上打印它的值

def controller_action
    @some_data = "some value"
end
然后我们知道我们可以在视图上打印它的值

<p>Some data has <%= @some_data %></p>
某些数据已丢失

我的问题是,在这样一个视图上犯错误时:

<p>Some data has <%= @somedata %></p>
某些数据已丢失

Ruby不会抱怨,而且很难发现这些错误。 这也适用于团队开发,一些程序员可以在控制器上用一个名称创建一个实例变量,而另一个程序员希望在视图上打印它,但意外地使用了另一个名称。

正如@BartJedrocha所说,您可以在视图顶部手动编写代码:

<% raise "Instance variable @somedata not defined" unless defined?(@somedata) %>

您甚至可以更进一步,在助手中创建一个方法,该方法可以将数组作为参数,并检查数组中的每个实例变量是否已定义,如果未定义,则会引发错误。不过这很烦人,我还没见过有人这么做


通过更好的错误宝石的好方法 我认为更好的解决方案是只将单个实例变量从控制器传递到视图,这被认为是最佳实践。这将减少此类错误发生的机会

此外,虽然我尽量不推荐代码库作为解决方案,但这在Rails中非常普遍,我认为这是可以接受的:gem将导致一个错误页面,该页面将清楚地列出视图中可用的所有实例变量,并使确定是否存在问题变得微不足道(请注意下图中的右下部分)

live shell将允许您使用REPL与当前状态交互,以进一步调查问题


通过“详细”模式的奇怪方式
最后,我认为您可以尝试在verbose模式下运行Rails。当从带有
-w
标志的命令行使用Ruby时,可以设置verbose模式,如果您尝试使用未定义的实例变量,则会发出警告。但是,我们使用的是Rails,而不是手动调用Ruby,因此为了传递该模式,您需要ld可能需要设置环境变量(
$VERBOSE=true
)在配置文件中。

如果变量未在控制器中声明,Rails默认情况下不会提供任何异常,相反,它只会将is视为“nil”。但即使在控制器中声明对象,变量仍有可能变为nil。因此,很难确定变量是否为nil,因为未声明或它得到了一个nil值

我们可能可以使用to_s转换来替换rails中的nil。因此,请尝试类似的方法,而不是引发错误或异常。

简单的解决方案:使用局部变量而不是实例变量

def controller_action
  render locals: { some_data: "some value" }
end
然后可以将其用作局部变量/方法

<p>Some data has <%= some_data %></p>
某些数据已丢失


如果您不传递它,或者如果您没有正确访问它(输入错误),您将得到一个无变量/方法定义错误。

您可以使用
定义?
检查实例变量是否已定义。例如
定义(@some\u data)
我不提供答案,但您的问题就在这里描述了TDD的好处。如果您为视图编写了一个测试,以确定视图上的正确显示(称之为功能或集成),您会在编写代码时很快发现错误(红色、绿色、重构).对我来说,这是一个比任何其他答案都简单的解决方案谢谢Rob.丑陋的方式当然是“丑陋的”我仍然可以在变量名上犯错误。更好的错误似乎在总体开发中很有希望。我会检查它。详细模式很有趣。我可以在运行时设置它吗?例如在视图文件的开头?@user2997817我不确定这是否可能-我的印象是,一旦解释器设置为以这种方式运行,在不重新执行代码的情况下,无法打开或关闭它。在每个预期有内容的变量上使用to_s实际上是很有趣的。Ruby会像预期的那样对拼写错误的变量进行投诉。但是这需要整个团队采用此技术。我希望有其他方法。