Ruby - 区别:变量和@variable

JW8*_*JW8 5 ruby ruby-on-rails-3

作为Ruby on Rails新手,我理解"@"和":"引用有不同的含义.我在SO中看到了这篇文章,其中描述了一些差异.

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

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

html.erb片段

<%= form_for @my_selection do |f| %>
Run Code Online (Sandbox Code Playgroud)

route.rb片段

resources :my_selections
Run Code Online (Sandbox Code Playgroud)

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

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>
Run Code Online (Sandbox Code Playgroud)

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

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

问题:

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

Ale*_*yne 13

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

不 :(

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

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

self.instance_variable_get "@#{my_symbol}"
Run Code Online (Sandbox Code Playgroud)

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

因此,您认为符号完全对应于实例变量的唯一原因是因为驱动您正在使用的API的代码以这种方式工作.如果没有为您完成此任务的框架,则根本没有相关性.

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

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

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

resources :my_selections
Run Code Online (Sandbox Code Playgroud)

将生成您将调用的路由,如下所示:

my_selections_path
Run Code Online (Sandbox Code Playgroud)

你的表单是如何产生一条my_selection_index_path我不确定的路线,这取决于你的模型是什么.

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