2012-09-28 285 views
0

我被给了这个ruby代码来概述。我对Ruby on Rails仍然陌生。我来自java背景。Ruby On Rails方法澄清

在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)“User”类的实例从未初始化。该方法甚至被称为?

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

3)如何在表单中调用此方法?我没有看到一个“User.last_name(”大卫“)或任何类似。

有人能澄清这些代码段吗? 而且请不要帖子的链接补习或其他任何东西,只是澄清这一段代码

+0

作业?尽管有你的要求,但我不得不建议你阅读Rails和Ruby的介绍。 – InternetSeriousBusiness

+0

不,它不是作业 –

回答

1

代码:由默认轨模板引擎使用

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

..是。这是查看代码。

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

表单操作对应于适当的控制器操作,该操作可能接受:last_name作为参数。提交表单时,控制器操作可能会实例化用户实例。然而,如果没有更多的代码,我不能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)我觉得我以前的描述应该帮助你理解这一点..

+0

谢谢,现在它是有道理的。那么'def last_name(name)...'是什么呢?它应该做同样的权利?但它不会在我尝试 –

+0

这可能是最简单的考虑ruby函数调用的方式,它包含一个名称和一个操作符。将'='符号想象成一个运算符,并将'def last_name(name)'作为一个没有运算符定义的方法来定义一个作为'last_name('John Doe')'执行的方法。然后,Ruby将该符号(名称)的'='操作映射到该方法。你应该阅读这篇简短的文章:http://www.ruby-lang.org/en/documentation/ruby-from-other-languages/ –

0
  1. MVC。在操作新被创建并分配给@user,这是将被用于表单的用户的一个新实例。

  2. 名字来源于方法声明def last_name=name

  3. 表单助手在将值赋给该变量并使用setter来完成时会执行last_name = name。编辑对象时,它将使用getter在文本字段中显示其值。你描述

+0

“窗体帮助程序将last_name =名称,当它赋值给该变量”,所以当用户分配一个值的形式,名称(这是空值)进入last_name变量? –

+0

是的。只要@user不为null。你可以使用attr_accessor自动为你创建它。 http://www.rubyist.net/~slagell/ruby/accessors.html –

0

您可以更好地了解点#2语法:

def last_name=(name) 
end 

=是部分函数的名字。

等价的C会

void last_name_equals(char *name) {} 

剩下的就是一个Rails教程的工作。

+0

我还是不明白。所以你告诉我的是,“变量名为空,并将其空值赋给last_name? –

+0

@TestTest:否,'name'只是变量的名称。如果调用instance.last_name ='“foo”','name'将在你的方法中包含''foo“'。 – InternetSeriousBusiness