Ruby – 区别:变量和@variable

作为一个Ruby on Rails新手,我理解“@”和“:”引用有不同的含义。 我在SO中看过这篇文章 ,描述了一些不同之处。

  1. @表示实例变量(例如,@ my_selection)
  2. 表示别名(例如:my_selection)

我遇到了一个标准MVC页面的情况,类似于我的webapp中的所有其他表单/页面。

html.erb片段

 

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 #<#:0x25439c3b> 

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

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

问题:

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

我对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来做正确的事情, my_selections_path直接基于您传入的符号。