2

我刚刚将嵌套资源添加到我的 Ruby on Rails 应用程序中。

它主要是猜测,复制和粘贴。

现在一切正常。

但我担心的是,在使用 url 助手时,我必须使用两种不同的变量形式——一种以 @ 开头,另一种没有 @。

在我的部分中,我使用了:

=> link_to t('ui.edit'), edit_course_lesson_path(@course, lesson)

如果我在课程之前添加“@”,则会出现以下错误:

Routing Error

No route matches {:action=>"edit", :controller=>"lessons", :course_id=>#<Course id: 2,
title: "title x", user_id: 1, subject_id: 1, student_level_id: 1, objectives: "obj xx",
created_at: "2013-08-09 15:51:38", updated_at: "2013-08-09 15:51:38">, :id=>nil}

Try running rake routes for more information on available routes.

在我的常规观点中:

=> link_to t('ui.edit'), edit_course_lesson_path(@course, @lesson)

最后一个例子,如果我写的课程没有'@',那么我得到:

undefined local variable or method `course' for #<#<Class:0x007f5e10082800>:0x007f5e10a64760>

只是想知道在视图中添加或省略“@”的区别。可能,这里的关键因素是部分视图与常规视图

非常感谢!

PS:另外,我发现这篇文章对嵌套资源主题很有用:

http://blog.8thcolor.com/2011/08/nested-resources-with-independent-views-in-ruby-on-rails/

4

2 回答 2

2

表示实例变量,在@控制器中为模型实例设置。例如,某些视图会调用局部视图:

= render @courses

将调用一个名为 _course.html.haml(或 erb 或 slim)的部分,并为每个渲染自动传递一个局部变量。

在该部分内部,您使用的是局部变量course,例如

= course.subject.title
= course.title

因此,在您的控制器呈现的标准视图中,您通常会使用实例变量,以便它们在控制器操作中可用,这意味着它可以在视图调用的部分中使用,而局部变量则不能。

于 2013-10-14T17:28:19.310 回答
2

您对 RoR 开发非常陌生,对吧?我鼓励您完整阅读一些 Rails 和 Ruby 初学者书籍,因为您似乎不了解 Ruby 的一些基本概念。

您的问题的简短且非常近似的答案。

没有@符号的变量是存在于局部范围内的局部变量——方法范围、部分范围、视图范围、块范围等。

带有@ 符号的变量是实例变量——它们存在于实例范围内。在控制器和视图范围相同的情况下,控制器操作中定义的实例变量可在您的部分、视图、布局中使用。

如果未定义,它们不会抛出任何错误,这是一件令人讨厌的事情-您只需返回一个 nil 对象。这就是您的路由错误中实际发生的情况 - @lesson 为 nil,Rails 无法构造正确的 URL。

在你的第二种情况下,你试图调用一个不存在的局部变量,所以它会抛出一个 NoMethodError,因为在找不到变量之后它会尝试调用同名的方法。

于 2013-10-14T17:29:06.907 回答