这可能是一个新手问题,但它是这样的:
我正在尝试解析嵌入的ruby代码,我需要一些帮助来理解用于方法调用和嵌入式ruby脚本中的变量访问的synthax。
例如,在这个调用中,@user.followed_users.count
(据我所知) @user是一个用户模型的实例,followed_users是一个(自动生成的)方法,count也是一个方法,对吗?
但是这些叫做micropost.content
micropost.created_at
micropost.user
的东西是什么呢?它们来自这个erb文件:
<li>
<span class="content"><%= micropost.content %></span>
<span class="timestamp">
Posted <%= time_ago_in_words(micropost.created_at) %> ago.
</span>
<% if current_user?(micropost.user) %>
<%= link_to "delete", micropost, method: :delete,
data:{ confirm: "You sure?" },
title: micropost.content %>
<% end %>
</li>
(这些是michael hartl rails教程中的代码示例)
Rails中有什么样的语法用于方法调用和从erb文件访问变量?是否可以从非实例或类变量的ruby文件中访问变量?
提前感谢您的阅读和帮助:)
发布于 2017-04-25 13:53:18
语法是相同的。
除了ERB是一种嵌入式语言,只有" ERB“标记中的代码被<% %>
执行之外,erb和Ruby在语法上没有什么主要区别。
局部变量和方法有什么区别?
方法是在对象上定义的方法对象。
def foo
"hello world"
end
# we can call it by
self.foo
# we can access the method object by
self.method(:foo)
这定义了main
上的foo
方法。
bar = "value"
定义局部作用域变量bar
。并不是说你不能做self.bar
,因为它只指向一个内存寄存器,而不是一个方法!你不需要调用变量,而是引用它们*。因此,术语“变量调用”是错误的。
正如@SergioTulentsev指出的那样,您可以使用defined?
检查micropost
是局部变量还是方法。请注意下面使用rails本地变量时的注意事项。
请参见:
在rails之外使用ERB
在Ruby语言中,顶层对象称为main
,它是“全局”对象。当您为实例变量<% @foo = "bar" %>
赋值时,您将其赋值给main
,即隐式self。
<%# raw_template.erb %>
<%= self.inspect %>
如果我们运行erb raw_template.erb
,它将输出main
。
赋值一个常规的词法变量(一个局部的) <% foo = "bar" %>
就像在任何其他ruby代码中一样。
正如您所看到的,在ERB模板和任何其他Ruby代码中变量的工作方式没有区别。
rails有什么不同之处?
Rails的一个核心部分是所谓的视图上下文。这是ActionView::Base
的一个实例,它是隐式的自我--“全局”对象。
你不必相信我的话。尝试在Rails的视图中包含以下内容:
<pre>
<%= self.inspect %>
</pre>
Rails获取控制器的所有实例变量,并将它们分配给视图上下文。这就是为什么您在控制器中分配的@something
实例变量也可用于您的视图。
Rails locals不是真正的局部变量
视图上下文还包含一个名为local_assigns
的散列。这些是在呈现模板时可以传递的“局部变量”:
render template: 'test', locals: { foo: 'bar' }
当您在test.html.erb
模板中调用<%= foo %>
时,调用将转到method_missing
,它将检查local_assigns
是否具有:foo
密钥。
这就是为什么在local_assigns
变量上使用defined?
不能像预期的那样工作。
但是语法是一样的。
Rails使用了一些元编程魔术来传递变量-但它不会改变语言的语法。
是否可以访问非实例或类变量的ruby文件中的变量?
是的,全局变量--在Ruby语言中,你可以使用符号$
来创建一个全局变量。
$foo = "bar"
但这很少使用,因为globals are evil。在Ruby中有更好的方法。
发布于 2017-04-25 11:58:36
<%= micropost.content %>
中的micropost
可以是局部变量,也可以是方法。没有办法区分哪一个是它,仅仅通过看这条线。最重要的是,micropost
的计算结果是可以调用.content
的。
如果你想知道它是哪一个(用于教育),你可以像这样输出它的类型:
<%= defined?(micropost) %>
它将返回"local-variable“或"method”(如果未定义,则返回nil )。
https://stackoverflow.com/questions/43609921
复制相似问题