我在进行Hartl's Tutorial时遇到了2个相似的代码。在清单8.25中,TO_DATE('2018/12/13 11:00:00', 'YYYY/MM/DD HH:MI:SS')
返回实例变量show
,该实例变量是通过Rails的@user
方法获得的。
find
在清单8.30中,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
中也有类似的情况,它使用create
并且也应返回一个实例变量,但是这次将其定义为find_by
而不是{{ 1}}。我真的不知道何时使用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
)。
答案 0 :(得分:0)
在这种情况下,例如,必须在users#new
中定义实例变量,才能在视图中对其进行访问。 Rails使用此特定机制将控制器上下文中定义的所有实例变量复制到视图中。
另一方面,在sessions#create
中,您仅想在登录成功后重定向用户,否则只显示登录表单,就像在sessions#new
中看到的那样,不需要任何操作实例变量已定义。因此,在这种情况下,局部变量就足够了。
答案 1 :(得分:0)
在以下情况下,大多数情况下我们需要使用实例变量,
请不要混淆
user
是局部变量。它们仅存在于其范围内(当前块)
@user
是一个实例变量-可供类中的所有方法使用。