0

我得到了这个 ruby​​ 代码来进行概述。我对 ruby​​ on rails 还是很陌生。我来自java背景。

在 User.rb 中:

  def last_name=name
    require 'debugger'; debugger
    self[:last_name] = name
  end

并告诉我这是一个setter方法。他们告诉我,这会以这一行的“形式”执行:

<%= f.label :last_name%>
<%= f.text_field :last_name %>

行。有人可以澄清这种荒谬的语法如何有效吗?

1) “用户”类的实例永远不会被初始化。该方法甚至是如何调用的?

2) 变量“name”从何而来?它的价值是什么?(变量名在其他地方没有被调用)这个语法代表什么?“def last_name=name” ?? 将尚未初始化的变量传递给方法?它是另一种语法的捷径,只是为了节省再输入 2 个符号?

3)如何以形式调用此方法?我没有看到“User.last_name("David") 或类似的东西。

有人可以澄清一下这些代码吗?并且请不要发布指向教程或其他任何内容的链接。只需澄清这段代码

4

3 回答 3

1

您描述的代码:

<%= f.label :last_name%>
<%= f.text_field :last_name %>

..由默认的 rails 模板引擎使用。这是查看代码。

1) 提交表单时,可能会初始化并填充用户实例。

表单动作对应于适当的控制器动作,它可能接受:last_name作为参数。当您提交表单时,控制器操作可能会实例化 User 实例。但是,如果没有更多代码,我不能 100% 确定您的应用程序就是这种情况。

2)变量name来自last_name方法接受的参数。

也许,为了帮助您理解该方法,让我们重写它:

def last_name= (name)
  require 'debugger'; debugger
  self[:last_name] = name
end

要么 要么last_name=('John Doe')last_name = 'John Doe'执行此方法。

3)我认为我之前的描述应该可以帮助您理解这一点。

于 2012-09-28T16:07:15.220 回答
0
  1. MVC。在操作 new 中,创建了一个新的 User 实例并将其分配给 @user,这将用于表单。

  2. 名称来自方法声明def last_name=name

  3. 表单助手在为该变量分配值并使用 setter 执行此操作时执行 last_name=name。当您编辑对象时,它将使用 getter 在文本字段中显示其值。

于 2012-09-28T16:04:06.023 回答
0

您可以使用以下语法更好地理解第 2 点:

def last_name=( name )
end

=是函数名称的一部分。

C等价物是

void last_name_equals( char *name ) {}

剩下的就是 Rails 教程的工作了。

于 2012-09-28T16:07:39.710 回答