【问题标题】:Variable calling in rails viewsRails 视图中的变量调用
【发布时间】:2013-10-14 17:02:02
【问题描述】:

我刚刚将嵌套资源添加到我的 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)

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

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

只是想知道在视图中添加或省略“@”的区别。可能,这里的关键因素是 partial vs regular view

非常感谢!

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

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

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-3 nested-resources


    【解决方案1】:

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

    = render @courses
    

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

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

    = course.subject.title
    = course.title
    

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

    【讨论】:

      【解决方案2】:

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

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

      不带@符号的变量是存在于局部作用域的局部变量——方法作用域、部分作用域、视图作用域、块作用域等。

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-07-28
        • 2013-09-15
        • 1970-01-01
        • 2020-03-12
        • 2012-11-30
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多