在Rails控制器中定义实例变量

时间:2018-12-20 08:17:47

标签: ruby-on-rails ruby

我在进行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)。

2 个答案:

答案 0 :(得分:0)

在这种情况下,例如,必须在users#new中定义实例变量,才能在视图中对其进行访问。 Rails使用此特定机制将控制器上下文中定义的所有实例变量复制到视图中。

另一方面,在sessions#create中,您仅想在登录成功后重定向用户,否则只显示登录表单,就像在sessions#new中看到的那样,不需要任何操作实例变量已定义。因此,在这种情况下,局部变量就足够了。

答案 1 :(得分:0)

在以下情况下,大多数情况下我们需要使用实例变量,

  1. 当我们需要从视图访问变量
  2. 如果我们要从操作中调用方法,而不是返回值,则可以直接从被调用方法中更新变量。

请不要混淆 user是局部变量。它们仅存在于其范围内(当前块)

@user是一个实例变量-可供类中的所有方法使用。