gpt4 book ai didi

ruby - :variable and @variable 之间的差异

转载 作者:数据小太阳 更新时间:2023-10-29 07:10:52 29 4
gpt4 key购买 nike

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

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

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

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

最佳答案

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

关于 ruby - :variable and @variable 之间的差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7211724/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com