2011-08-27 125 views
5

作为Ruby on Rails的新手,我明白“@”和“:”引用有不同的含义。我在SO中看到了this post,其中描述了一些差异。Ruby - 变量和@variable之间的区别

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

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

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解决我的原始错误?

回答

13

Is my understanding of the difference between :my_selections and @my_selections correct?

都能跟得上:(

:指示符号,它不是什么本质上的别名。这就像一个不变的字符串,它经常被用来作为一个名称来代表的东西。

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

self.instance_variable_get "@#{my_symbol}" 

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

因此,您认为符号完全对应于实例变量的唯一原因是因为驱动您使用的API的代码以这种方式工作。没有一个框架来为你做这件事,根本就没有关联。

Why would switching to :my_selection resolve my original error?

for_form(model_instance)将生成提交到创建行动,如果该模型实例未保存,或将更新行动,如果该模型已经在您的数据库退出表单。

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

resources :my_selections 

会产生你会调用这样的路线:

my_selections_path 

如何使你的表单生成my_selection_index_path路线我不知道,它真的取决于你的模型是什么。

而当您传递一个符号,而没有相应的ivar时,它会使用它作为路径生成的模型名称。如果试图调用my_selections_path,它会直接基于你传入的符号来做正确的事情。

+0

我必须检查一下我的模型在做什么,但我绝对赞赏这个解释。 – JW8

相关问题