Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails Rails 4-如何优化此代码_Ruby On Rails_Ruby_Ruby On Rails 4_Ruby On Rails 4.2 - Fatal编程技术网

Ruby on rails Rails 4-如何优化此代码

Ruby on rails Rails 4-如何优化此代码,ruby-on-rails,ruby,ruby-on-rails-4,ruby-on-rails-4.2,Ruby On Rails,Ruby,Ruby On Rails 4,Ruby On Rails 4.2,假设我有以下代码: class BooksController < ApplicationController def action1 @books = ... @books = @books.someaction param1, param2 end def action2 @books = ... @books = @books.someaction param1, param2 end

假设我有以下代码:

class BooksController < ApplicationController

    def action1
        @books = ...
        @books = @books.someaction param1, param2
    end

    def action2
        @books = ...
        @books = @books.someaction param1, param2
    end

    def action3
        @books = ...
        @books = @books.someaction param1, param2
    end

    ...

    def action84
        @books = ...
        @books = @books.someaction param1, param2
    end
class BooksController
我经常在一个实例变量上运行这个操作。我曾想过在动作后进行
过滤,但那是在渲染后发生的,所以这是不好的

我如何优化这个


免责声明:这是一个夸大的案例,不是真实的案例。只是想让问题更加形象化。我没有具有84操作的控制器。

只需在控制器中声明一个私有函数,并在操作中使用它:

class BooksController < ApplicationController
  def action1
    @books = ...
    foo
  end

  def action2
    @books = ...
    foo
  end

  def action3
    @books = ...
    foo
  end

  ...

  def action84
    @books = ...
    foo
  end

  private

  def foo
    @books = @books.someaction param1, param2
  end
end
class BooksController
只需在控制器中声明一个私有函数,并在操作中使用它:

class BooksController < ApplicationController
  def action1
    @books = ...
    foo
  end

  def action2
    @books = ...
    foo
  end

  def action3
    @books = ...
    foo
  end

  ...

  def action84
    @books = ...
    foo
  end

  private

  def foo
    @books = @books.someaction param1, param2
  end
end
class BooksController
我会看一下。这应该允许您只执行以下操作:

class BooksController < ApplicationController
    expose(:books) { books.someaction param1, param2 }

    def action1
        books = ...
    end

    def action2
        books = ...
    end

    def action3
        books = ...
    end

    ...

    def action84
        books = ...
    end
end
class BooksController
我会看一下。这应该允许您只执行以下操作:

class BooksController < ApplicationController
    expose(:books) { books.someaction param1, param2 }

    def action1
        books = ...
    end

    def action2
        books = ...
    end

    def action3
        books = ...
    end

    ...

    def action84
        books = ...
    end
end
class BooksController
您可以覆盖
渲染
,只需特定控制器在渲染之前始终执行您的操作即可。大概是这样的:

class BooksController < ApplicationController

  def action1
    @books = ...
  end

  def action2
    @books = ...
  end

  private

  def render(*args)
    if @books.present? && param1.present? && param2.present?
      @books = @books.someaction param1, param2
    end
    super
  end

end
class BooksController
您可以覆盖
渲染
,只需特定控制器在渲染之前始终执行您的操作即可。大概是这样的:

class BooksController < ApplicationController

  def action1
    @books = ...
  end

  def action2
    @books = ...
  end

  private

  def render(*args)
    if @books.present? && param1.present? && param2.present?
      @books = @books.someaction param1, param2
    end
    super
  end

end
class BooksController
如果所有操作的逻辑都相同,我不知道为什么要使用所有这些操作。但是,您在采取行动之前是否尝试过
?i、 在一个方法中收集所有公共实例变量,该方法在操作执行之前执行。我并不是说所有操作都使用它。可能还有其他人不使用它。我不能使用before操作,因为它是执行主代码的操作本身,并且我希望在该代码的结果上执行我的代码。如果所有操作的逻辑相同,我不确定为什么要使用所有这些操作。但是,您在采取行动之前是否尝试过
?i、 在一个方法中收集所有公共实例变量,该方法在操作执行之前执行。我并不是说所有操作都使用它。可能还有其他人不使用它。我不能使用before操作,因为它是执行主代码的操作本身,并且正是基于该代码的结果,我想执行我的代码。那么,我认为您没有其他选择,除了将其提取到
before\u filter
方法,并且确保在之前运行的其他
操作之前
中声明所有必需的变量。那么,我认为除了将其提取到一个
过滤器之前
方法之外,您没有任何其他选项,并且确保在之前运行的其他
操作之前
中声明所有必需的变量。这看起来有点像是一个
在动作之后\u在渲染之前
过滤器:)这是一个很好的解决方案。我不知道你能这么做+1有趣。这看起来有点像是一个
在动作之后\u在渲染之前
过滤器:)这是一个很好的解决方案。我不知道你能这么做+1在看到Unixmonkey解决方案后,整个宝石似乎有点矫枉过正,但绝对是一个有趣的宝石,我不知道。我会看一看的。谢谢我会同意并使用@Unixmonkey的解决方案,除非您想要这个gem提供的其他好处,否则它看起来要好得多。如果你想使用gem,我会说走这条路(因为你已经在使用其他东西了)。在看到Unixmonkey解决方案后,整个gem似乎有点过头了,但肯定是一个有趣的gem,我不知道。我会看一看的。谢谢我会同意并使用@Unixmonkey的解决方案,除非您想要这个gem提供的其他好处,否则它看起来要好得多。如果你想使用gem,我会说走这条路(因为你已经在使用其他东西了)。否则,不要仅为该功能添加它。