6

これは Ryan Bates の railscast サイトで見つけましたが、どのように機能するのかわかりません。

#models/comment.rb
def req=(request)
    self.user_ip    = request.remote_ip
    self.user_agent = request.env['HTTP_USER_AGENT']
    self.referrer   = request.env['HTTP_REFERER']
end

#blogs_controller.rb
def create
    @blog = Blog.new(params[:blog])
    @blog.req = request
    if @blog.save
        ...

彼はユーザー IP、ユーザー エージェント、およびリファラーを保存しているように見えますが、その行と混同されていreq=(request)ます。

4

3 に答える 3

6

Karmen Blake の answerKandadaBoggu の answerに基づいて構築するために、最初のメソッド定義は、この行が実行されたときにそうします。

@blog.req = request

代わりにこれを行うようなものです:

@blog.user_ip    = request.remote_ip
@blog.user_agent = request.env['HTTP_USER_AGENT']
@blog.referrer   = request.env['HTTP_REFERER']

基本的にショートカットを設定します。変数の値を代入しているように見えますが、実際には という名前のメソッドを呼び出してreq=おり、requestオブジェクトは最初の (そして唯一の) パラメータです。

これが機能するのは、Ruby では関数を括弧の有無にかかわらず使用できるためです。

于 2010-04-16T05:33:03.770 に答える
6

その行は と呼ばれるメソッドを定義しますreq=。末尾の=文字は、代入方法になります。

これは通常のセッター メソッドです。

def foo(para1)
  @foo = para1
end

setter メソッドは、次のように代入メソッドとして書き直すことができます。

def foo=(para1)
  @foo = para1
end

2 つのセッター メソッドの違いは、呼び出し構文にあります。

割り当てセッター:

a.foo=("bar")   #valid syntax
a.foo= ("bar")  #valid syntax
a.foo = ("bar") #valid syntax
a.foo= "bar"    #valid syntax
a.foo = "bar"   #valid syntax

レギュラーセッター:

a.foo("bar")    #valid syntax
a.foo ("bar")   #valid syntax
a.fo o ("bar")  #invalid syntax
于 2010-04-16T05:21:15.907 に答える
2
def name=(new_name)
 @name = new_name
end

has the same functionality as:

def name(new_name)
 @name = new_name
end

ただし、メソッドを呼び出すときは、引数を渡すのではなく代入を使用して、より自然に見えるステートメントを取得します。

person = Person.new
person.name = "John Doe"

対。

person.name("John Doe")

それが役立つことを願っています。

于 2010-04-16T05:19:36.233 に答える