我收到了这个红宝石代码的概述。我还是铁杆上的红宝石。我来自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“)或类似的东西。
有人可以澄清这些代码吗? 请不要发布指向教程或其他任何内容的链接。只需澄清这段代码
答案 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)
MVC。在操作new中,创建了一个新的User实例并将其分配给@user,这将用于表单。
名称来自方法声明def last_name=name
表单助手在为该变量赋值并使用setter执行此操作时,会执行last_name = name。编辑对象时,它将使用getter在文本字段中显示其值。
答案 2 :(得分:0)
您可以使用以下语法理解更好的第2点:
def last_name=( name )
end
=
是函数名称的一部分。
C等价物
void last_name_equals( char *name ) {}
其余的是Rails教程的工作。