这可能是一个noob问题,但在这里:我试图解析嵌入的ruby代码,我需要一些帮助来理解嵌入式ruby脚本中方法调用和变量访问的synthax。
例如,在这个调用中@user.followed_users.count
(据我所知)@user是用户模型的一个实例,follow_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文件中访问变量?
提前感谢阅读和帮助:)
答案 0 :(得分:1)
ERB和Ruby之间没有重大的语法差异,只是ERB是一种嵌入式语言,只执行“erb”标记中的代码<% %>
。
方法是在对象上定义的方法对象。
def foo
"hello world"
end
# we can call it by
self.foo
# we can access the method object by
self.method(:foo)
这定义了foo
上的方法main
。
bar = "value"
定义本地范围的变量bar
。并不是说你不能做self.bar
,因为它只指向一个内存寄存器,而不是一个方法!你不调用变量 - 你引用它们*。因此,“变量调用”一词是错误的。
正如@SergioTulentsev指出的那样,您可以使用micropost
检查defined?
是否是本地变量或方法。请注意下面使用 rails locals 时的警告。
请参阅:
在Ruby中,顶级对象称为main
,它是“全局”对象。
分配实例变量<% @foo = "bar" %>
时,您将其分配给main
,这是隐式自我。
<%# raw_template.erb %>
<%= self.inspect %>
如果我们运行erb raw_template.erb
,则会输出main
。
分配常规词汇变量(本地)<% foo = "bar" %>
就像在任何其他ruby代码中一样。
正如您所看到的,变量在ERB模板和任何其他Ruby代码中的工作方式没有区别。
Rails的核心部分是所谓的视图上下文。这是ActionView::Base
的一个实例,它是隐式的自我 - “全局”对象。
你不必接受我的话。尝试在Rails的视图中包含它:
<pre>
<%= self.inspect %>
</pre>
Rails获取控制器的所有实例变量并将它们分配给视图上下文。为什么您在控制器中分配的@something
实例变量也可用于您的视图。
视图上下文还包含一个名为local_assigns
的哈希。这些是渲染模板时可以传递的“局部变量”:
render template: 'test', locals: { foo: 'bar' }
当您在<%= foo %>
模板中致电test.html.erb
时,来电method_missing
会检查local_assigns
是否有:foo
密钥。
这就是为什么在defined?
变量上使用local_assigns
无法正常工作。
Rails使用一些元编程魔法来传递变量 - 但它不会改变语言的语法。
是否可以从不是的ruby文件中访问变量 实例或类变量?
是的,全局变量 - 在Ruby中,您可以使用sigil $
创建一个全局变量。
$foo = "bar"
但这很少使用,因为globals are evil。在Ruby中有更好的方法。
答案 1 :(得分:0)
micropost
中的 <%= micropost.content %>
可以是局部变量或方法。只是通过查看线路,无法分辨出它是什么。重要的是micropost
评估某些,您可以致电.content
。
如果你想知道它是什么(用于教育),你可以输出如下类型:
<%= defined?(micropost) %>
它将返回&#34; local-variable&#34;或&#34;方法&#34; (或者,如果没有定义,则为零。)