Ruby - 区别:变量和@variable

时间:2011-08-27 00:22:43

标签: ruby ruby-on-rails-3

作为一个Ruby on Rails新手,我理解“@”和“:”引用有不同的含义。我在SO中看到this post,其中描述了一些差异。

  1. @ 表示实例变量(例如,@ my_selection)
  2. 表示别名(例如:my_selection)
  3. 我遇到了一个我有一个标准MVC页面的情况,类似于我的webapp中的所有其他表单/页面。

    html.erb代码段

    <%= form_for @my_selection do |f| %>
    

    route.rb代码段

    resources :my_selections
    

    当我尝试访问此页面时,出现此错误:

    NoMethodError in selections#create
    Showing C:/somedir/myapp/app/views/my_selections/index.html.erb where line #16 raised:
    undefined method `my_selection_index_path' for #<#<Class:0x1197e5676>:0x25439c3b>
    

    第16行是上面显示的表单摘要。

    我在同一个网络应用中的所有其他表单/页面都以完全相同的方式设置并且工作正常。但是,一旦我将erb表单引用更改为:my_selection ,此错误就会消失,我的页面会正常运行。

    问题:

    1. 我对my_selections和@my_selections之间区别的理解是正确的吗?
    2. 为什么要切换到:my_selection解决我的原始错误?

1 个答案:

答案 0 :(得分:13)

  

我是否理解了my_selections和。之间的区别   @my_selections正确吗?

不:(

:表示符号,它不是任何内在的别名。它就像一个不可变的字符串,通常用作表示某事物的名称。

在Rails api接受一个符号代替实例变量的地方,在内部它实际上是这样做的:

self.instance_variable_get "@#{my_symbol}"

实际上返回所请求的实例变量的值。

因此,您认为符号完全对应于实例变量的唯一原因是因为驱动您正在使用的API的代码以这种方式工作。没有框架可以为你做到这一点,根本就没有相关性。

  

为什么要切换到:my_selection解决我的原始错误?

for_form(model_instance)将生成一个表单,如果模型实例未保存,则提交给create操作;如果模型已经退出数据库,则生成更新操作。

不,我不知道@my_selection中有什么内容,但无论它是什么类似乎都没有正确生成路由。

resources :my_selections

将生成您将调用的路径:

my_selections_path

您的表单如何为my_selection_index_path生成路由我不确定,这实际上取决于您的模型。

当您传递符号而没有相应的ivar时,它会将其用作路径生成的模型名称。通过尝试调用my_selections_path来做正确的事情,{{1}}直接基于您传入的符号。