class ApplicationController < ActionController::Base
  protect_from_forgery #What is this syntax? When is this executed and how to create one?
end

class Comment < ActiveRecord::Base
  belongs_to :post
  attr_accessible :body, :commenter, :post
end

在第一种情况下,我理解applicationcontroller是模块actioncontroller中名为Base的新派生类。下一行怎么办?protect_from_forgery是基类中的方法还是模块actioncontroller中的方法?它叫什么?我在ruby类文档中找不到。我试图在基类中创建一个方法,但出现了如下错误。如何创建可以在类中使用的特殊命令?
class Base
  def foo
    @name = "foo"
  end
end

class Der < Base
  foo
  def bar
    @dummy = "bar"
  end
end

错误:
expr1.rb:62:in `<class:Der>': undefined local variable or method `foo' for Der:Class (NameError)
    from expr1.rb:61:in `<main>'

最佳答案

protect_from_forgery是在ActionController::Base中包含的一个模块中定义的类方法,当您从ActionController::Base继承时,该方法可用于子类。
rails中的这种方法有时被称为“宏”,因为它们是类方法,能够实现某些特定的特性(有时还使用元编程来定义额外的方法或帮助程序)。实际上,术语“宏”是不正确的,因为ruby没有宏。它们不过是类方法。
要记住的最重要的细节是,当它们在类定义中使用时。这些方法在代码评估时运行,而不是在运行时运行。

class Base
  def foo_instance
    p "foo instance"
  end

  def self.foo_class
    p "foo class"
  end
end

class Der < Base
  foo_class
  def bar
    p "bar"
  end
end

Der.new.bar

将生产
"foo class"
"bar"

09-29 21:48