我很难理解所需的赋值函数,如chapter 8.2.3中所述。 Hartl的教程。
作为上下文,他专注于以下sign_in
函数的第二行:
def sign_in(user)
cookies.permanent[:remember_token] = user.remember_token
self.current_user = user #<-- this line
end
他提到的因为它是赋值,所以必须将其单独定义为
def current_user=(user)
@current_user = user
end
方法current_user=
明确设计用于处理分配至current_user
。我的困惑是:
为什么这甚至是必要的?我认为一个简单的=
可以让你分配东西。例如user.email = hello@kitty.com
此外,当最终他将代码redirect_to current_user
时,属于SessionsController
的内容如何转换为UsersController
控制的视图?
谢谢!
答案 0 :(得分:5)
原因是需要避免在方法调用和变量赋值之间混淆(对于解释器/ VM)
def foo
# Two completely different things!
bar = "baz" # assigns baz to local variable bar
self.bar = "baz" # invokes the bar= method with parameter of baz
end
正在发生的事情是他正在做两件事,首先用用户对象调用current_user=
方法,然后将其设置为@current_user
(这不是一个很好的例子 - 你可能会结束如果要制作current_user=
方法(例如设置会话变量),那么在现实生活中做更多事情。)
其次redirect_to current_user
相当于redirect_to user_path(current_user)
- 请查看http://api.rubyonrails.org/classes/ActionController/Redirecting.html以获取更多详细信息,其中说明了redirect_to可以采用的不同参数类型。请注意,这是一个重定向,而不是渲染 - 所以这里会发生第二个HTTP请求。