2010-04-16 3 views
6

Ryan Bates의 railscast 사이트에서이 사실을 발견했지만 어떻게 작동하는지 잘 모릅니다.메소드 정의에 대해 혼동 : def req = (요청)

#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) 라인 혼란 스러워요.

답변

6

는 첫 번째 방법의 정의는이 라인이 실행이 너무 때 수, Karmen Blake's answerKandadaBoggu's 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 개체는 첫 번째 (및 유일한) 매개 변수입니다.

이 기능은 루비에서 괄호 사용 여부에 관계없이 사용할 수 있기 때문에 효과가 있습니다.

+0

답변 해 주셔서 감사합니다. 하지만 user_ip, user_agent, referrer는 comment.title, comment.body etc/comment와 같이 주석 db 테이블의 일부입니다. 왜 @ blog.user_ip를 사용해야합니까? –

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") 

희망.

6

해당 줄은 req=이라는 메서드를 정의합니다. 결국 = 문자가 할당 방법이됩니다.

이 정규 세터 방법으로서 다음과 같이 설정 메소드가 할당 방법으로 다시 쓸 수

def foo(para1) 
    @foo = para1 
end 

: 두 세터 방법 사이

def foo=(para1) 
    @foo = para1 
end 

차이는 호출에 통사론.

할당 세터 :

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 
+0

자세한 답변을 보내 주셔서 감사합니다. –