是否可以强制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不会抱怨并且很难找到这些错误。 这也适用于团队开发,其中一些程序员可以在一个控制器上创建一个具有一个名称的实例变量,另一个程序员希望在视图上打印它但是偶然使用其他名称。
答案 0 :(得分:3)
正如@BartJedrocha所说,你可以在你的视图顶部手动编码:
<% raise "Instance variable @somedata not defined" unless defined?(@somedata) %>
你甚至可以更进一步,在一个帮助器中创建一个方法,该方法可以将数组作为参数,并检查数组中的每个实例变量是否已定义,如果没有则引发错误。但是,这很烦人,我还没有看到有人这样做。
我认为更好的解决方案是只将一个实例变量从您的控制器传递到您的视图,这被认为是最佳做法。这将减少发生此类错误的机会。
此外,虽然我尽量不推荐代码库作为解决方案,但这个在Rails中是如此普遍,我认为这是可以接受的:Better_Errors gem将导致错误页面清楚地列出所有可用的实例变量在您看来并确定是否存在问题(请注意下图中的右下部分)。
实时shell将允许您使用REPL与当前状态进行交互以进一步调查问题。
最后,我猜你可以尝试以详细模式运行Rails。从命令行使用带有-w
标志的Ruby时,可以设置详细模式,如果您尝试使用未定义的实例变量check out this resource for more,则会发出警告。但是,我们使用Rails而不是自己手动调用Ruby,因此为了传递它,您可能需要在配置文件中设置环境变量($VERBOSE=true
)。
答案 1 :(得分:1)
简单的解决方案:使用本地而不是实例变量
def controller_action
render locals: { some_data: "some value" }
end
然后你可以将它用作局部变量/方法
<p>Some data has <%= some_data %></p>
如果您没有通过它,或者如果您没有正确访问它(使用拼写错误),您将获得无变量/方法定义的错误。
答案 2 :(得分:0)
如果变量未在控制器中声明,则默认情况下Rails不会提供任何异常,而只是将其视为“nil”。但即使您在控制器中声明对象,变量仍有可能变为零。所以很难找到变量是否为零,因为它没有被声明或者它的值为零。
我们可以使用to_s转换替换rails中的nil。所以请尝试这样的方法,而不是引发错误或异常。