嵌入式ruby脚本中方法调用和变量调用之间的语法差异?

时间:2017-04-25 11:51:50

标签: ruby-on-rails ruby erb

这可能是一个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文件中访问变量?

提前感谢阅读和帮助:)

2 个答案:

答案 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 时的警告。

请参阅:

在rails之外使用ERB

在Ruby中,顶级对象称为main,它是“全局”对象。 分配实例变量<% @foo = "bar" %>时,您将其分配给main,这是隐式自我。

<%# 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' }

当您在<%= 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; (或者,如果没有定义,则为零。)