InstanceVariableAssumption:UsersController对实例变量'@user'假定过多

问题描述 投票:1回答:3

我正在关注Michael Hartl教程Rails课程。在chapter 7上,我在UsersController上运行Reek,我得到以下警告:

app / controllers / users_controller.rb - 1警告: 1:InstanceVariableAssumption:UsersController对变量'@user'假设过多[https://github.com/troessner/reek/blob/master/docs/Instance-Variable-Assumption.md]

这是我的代码:

class UsersController < ApplicationController
  def new
    @user = User.new
  end

  def create
    @user = User.new user_params
    if @user.save
      flash[:success] = t "welcome_to_app"
      redirect_to @user
    else
      render "new"
    end
  end

  def show
    @user = User.find_by id: params[:id]

    return if @user
    flash[:danger] = t "not_exist_user"
    redirect_to root_path
  end

  private

  def user_params
    params.require(:user).permit :name, :email, :password,
      :password_confirmation
  end
end

请解释为什么我收到此错误InstanceVariableAssumption以及如何解决此问题。

ruby-on-rails ruby reek
3个回答
3
投票

这看起来像是在GitHub页面上惹恼recommends disabling的气味之一。根据this bug report提交的项目,看起来这只是由于铁路使用/鼓励模式,默克不喜欢。


1
投票

实例变量假设说:

类不应该假设实例变量在当前类定义之外设置或存在。

好吧,这就是在Rails中使用Convention over configuration的地方。 Rails有自己的做事方式,而且类:UsersController依赖于类:User

变量:@userUsersController中定义的实例变量,但这是类User的对象。这就是Rails中完成的事情,你会发现它无处不在。

根据Reek gem,假设这不完美,但这就是Ruby on Rails中的事情。


0
投票

我们可以像这样使用:

attr_reader :user, :users

然后所有@user,@ users都可以写成userusers

最新问题
© www.soinside.com 2019 - 2024. All rights reserved.