【发布时间】:2018-12-20 08:17:46
【问题描述】:
我在执行Hartl's Tutorial 时遇到了 2 个非常相似的代码。在代码清单 8.25 中,show 返回了一个实例变量 @user,它是通过 Rails 的 find 方法获得的。
class UsersController < ApplicationController
def show
@user = User.find(params[:id])
end
def new
@user = User.new
end
def create
@user = User.new(user_params)
if @user.save
log_in @user
flash[:success] = "Welcome to the Sample App!"
redirect_to @user
else
render 'new'
end
end
private
def user_params
params.require(:user).permit(:name, :email, :password,
:password_confirmation)
end
end
在代码清单 8.30 中,create 也有类似的情况,它使用了find_by,也应该返回一个实例变量,但这次它被定义为user 而不是@user。我真的不知道什么时候使用@,而且我还观察到两者都是控制器,所以我认为语法应该是一致的。这种差异是否有原因?一般来说,我们何时允许或不允许使用@ 定义实例变量?
class SessionsController < ApplicationController
def new
end
def create
user = User.find_by(email: params[:session][:email].downcase)
if user && user.authenticate(params[:session][:password])
log_in user
redirect_to user
else
flash.now[:danger] = 'Invalid email/password combination'
render 'new'
end
end
def destroy
log_out
redirect_to root_url
end
end
我的一个附带问题是,我是否可以得出结论,控制器中定义的任何方法都绝对是类方法,因此需要User.new,而在我们需要定义方法的模型中,由于额外的提供了灵活性,我们需要在实现过程中明确声明它是类方法def User.new_token还是实例方法(def remember)。
【问题讨论】:
标签: ruby-on-rails ruby