Ruby On Rails方法澄清

时间:2012-09-28 15:57:08

标签: ruby-on-rails-3

我收到了这个红宝石代码的概述。我还是铁杆上的红宝石。我来自java背景。

在User.rb中:

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

告诉我这是一个二传手法。他们告诉我,这是在这一行的“形式”中执行的:

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

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

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

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

3)如何在表格中调用此方法?我没有看到“User.last_name(”David“)或类似的东西。

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

3 个答案:

答案 0 :(得分: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)我认为我之前的描述可以帮助您理解这一点..

答案 1 :(得分:0)

  1. MVC。在操作new中,创建了一个新的User实例并将其分配给@user,这将用于表单。

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

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

答案 2 :(得分:0)

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

def last_name=( name )
end

=是函数名称的一部分。

C等价物

void last_name_equals( char *name ) {}

其余的是Rails教程的工作。