Ruby on rails 你能解释一下';这个Ruby代码中发生了什么?

Ruby on rails 你能解释一下';这个Ruby代码中发生了什么?,ruby-on-rails,ruby,Ruby On Rails,Ruby,我现在正在努力学习Ruby以及RubyonRails。我正在学习Rails第1版,但我很难理解其中的一些代码 我一般都用C、C++或java工作,所以露比对我来说是个很大的变化。 我目前被数据库迁移器的以下代码块难住了: def self.up create_table :entries do |t| t.string :name t.timestamps end end t变量来自哪里?它实际上代表什么?它有点像for(i=0;icreate_

我现在正在努力学习Ruby以及RubyonRails。我正在学习Rails第1版,但我很难理解其中的一些代码

我一般都用C、C++或java工作,所以露比对我来说是个很大的变化。 我目前被数据库迁移器的以下代码块难住了:

  def self.up
    create_table :entries do |t|
      t.string :name
      t.timestamps
    end
  end

t变量来自哪里?它实际上代表什么?它有点像for(i=0;icreate_table)中的“i”吗?create_table是一个接受lambda表达式(某种委托)的方法,t是委托的参数

t.string :name
t.timestamps
类似伪代码的东西

delegate d = funciton (t) {
   t.string :name
   t.timestamps
}
create_table(d);
java中的直接模拟是一个非常简单的类

addReturnBackListener(new Listener<EventObject>() {
  public void handle(EventObject e) {
     refreshAndShowAndList();
  }
});
addReturnBackListener(新侦听器(){
公共无效句柄(EventObject e){
refreshAndShowAndList();
}
});

“:entries”根本没有定义,它只是一个标识符。您可以将其视为简单的字符串(但不需要花费内存来保存字符)。

我将采用
t
方法。
create\u table
方法就像一个C函数,它采用一个函数指针,该指针包含一个参数,即表定义对象(请原谅我不存在的C技能):

但在Ruby中,传递函数的定义可以在调用
create\u table
方法时完成。因此
do
end
之间的位类似于
entries\u table\u构造函数
函数,
t
变量类似于
table\u definition
参数

然而,C中的函数指针和Ruby中的块之间有很大的区别。在Ruby中,块外的所有局部变量都在块内可用:

a = 10
create_table :entries do |t|
  puts a
  ...
end

查看Ruby中的
yield
关键字,了解如何编写自己的方法,如
create\u table

,这是Ruby中块的典型用法。方法create\u table在ActiveRecord中定义如下:

def create_table(table_name)
  table_object = some_table_setup
  yield(table_object) # your code block which was passed implicitly is invoked here
  create_table(table_object)
end

:entries
是一个符号文字,它是一个文字值,类似于
7
“字符串”
。无需定义(顺便说一句,函数不知道控制器的名称)

t
是传递给
create\u tables
方法的块的参数。您在这里编写的内容大致类似于:

void anonymous_block(Table *t) {
   t->string("name");
   t->timestamps();
}

...

create_table("entries", &anonymous_block);

< C++ > .>代码> CuraTyTabe> /Cuff>调用您的块并传递一个参数,您已经命名为“代码> t< /COD>”。我建议您得到Ruby的入门书,而不是Rails。我推荐Ruby为Rails提供David A. Black。

:条目引用Rails中的条目表。

据我所知,当“generate controller”命令发出时,迁移者就会知道这一点(与Rails专业合作了一年,但仍在学习)

至于| t |这是一个块。引用鹤嘴锄书(你应该立即获得pdf或枯树版本的副本):

块可用于定义必须在某种事务控制下运行的代码块。例如,您通常会打开一个文件,对其内容执行某些操作,然后希望确保在完成时关闭该文件。尽管您可以使用常规代码执行此操作,但仍有理由让该文件负责自动关闭。我们可以用块来完成

因此,上面所说的是| t |是一个块,它负责建立到数据库的连接,根据行的特定类型创建行,然后关闭连接

下面是另一个例子:

output_string = "Let's print this to file"

File.open('outputfile.txt','w') do |f| #f for file
  f.print output_string
end
对于迭代器,是的,您也可以这样做:

an_array = [1,2,3,4]
an_array.each do |line|#line is the block for the elements of the array during iteration
   puts "Now we are at: #{line.to_s}!" 
end

create\u table
方法在Ruby中被称为块,
t
是该块的局部变量(
t
只是Rails迁移中的一个约定,代表“table”)。这是Ruby块的另一个更明显的例子:

10.times do |i|
  print "i is #{i}"
end

:entries
是一个Ruby符号,这是一种用于命名事物的轻量级字符串。您可以同样使用
“entries”
。符号的一个常见用途是指定哈希中的键。在任何一种情况下,创建的表都被命名为“entries”.

条目是对条目模型的引用-每个模型都假定表名与其名称相同,只是表化了()

t是一个传递到create_table方法的块参数,请参阅以获得更好的示例。在本例中,t表示已创建的表()


希望这足以帮助您

我碰巧正在开发一款应用程序,它也有一个
条目
模型/
条目
表。以下是我的迁移:

class CreateEntries < ActiveRecord::Migration
  def self.up
    create_table :entries do |t|
      t.string :title
      t.text :entry
      # ...
    end
  end

  def self.down
    drop_table :entries
  end
end
或者

一个块可以采用由两个“
|
”括起的参数s、 在本例中,
create\u table
方法将类
TableDefinition
的对象传递给块,因此为了回答您的一个问题,
t
是保存该对象的var。然后在块内,我们调用
TableDefinition
的各种实例方法

TableDefinition
对象来自何处?发生在
create_table()
方法中。它包含实例化新
TableDefinition
对象并将其“产生”到块的代码

ActiveRecord源代码

def create_table(table_name, options = {})
  table_definition = TableDefinition.new(self)
  table_definition.primary_key(options[:primary_key] || "id") unless options[:id] == false

  yield table_definition

  # ...

end

entries
就在那里定义。代码正在调用方法
create_table
,其中包含两个参数—所需的表名和一块代码


create\u table将构造一个
TableDefinition
对象,然后屈服于代码块,将该对象提供给它。在代码块中,它将被命名为
t
。最后,该代码块调用
t
上的一些方法来构建列。

因为来自Python,我很难理解这种结构米斯酒店
`do ... end`
`{ ... }`
def create_table(table_name, options = {})
  table_definition = TableDefinition.new(self)
  table_definition.primary_key(options[:primary_key] || "id") unless options[:id] == false

  yield table_definition

  # ...

end
def create_table(name, setup):
    t = Table(name)
    setup(t)
def setup_entries(t): # <-- here is your |t|, just a function argument
    t.string("name")
    t.timestamps()
create_table("entries", setup_entries)