【问题标题】:Memoization in Rails controllersRails 控制器中的记忆
【发布时间】:2014-03-09 05:04:11
【问题描述】:

我正在使用 Rails 4.0,我想消除一些重复的行,但我不知道在 Rails 中这样做的含义。据我了解,每个请求中都会创建一个控制器实例1

class ResetController < ApplicationController
  def reset_password
    user = User.find_by_email(params[:email])
    if user
      ...
  end

  def reset_user_token
    user = User.find_by_email(params[:email])
    if user
      ...
  end
end

如果我不使用 Rails,我的想法是使用 memoization 提取私有方法并删除重复的行:

private

def user
  @user ||= User.find_by_email(params[:email])
end

在 Rails 控制器中这样做是个好主意吗?你如何改进这段代码?我在应用程序的很多部分都有类似的问题。

相关:
- When to use memoization in Ruby on Rails
- Rails Best Practices: Use memoization

【问题讨论】:

  • 在这种情况下完全没问题

标签: ruby-on-rails memoization code-duplication


【解决方案1】:

这似乎与记忆没有太大关系,因为正如您自己所说,在这些请求之间启动了一个新实例,因此不会“存储”任何内容。

仍然删除代码中的那些重复项是个好主意。在您的情况下,Rails 执行此操作的方法是 before_filter:

class ResetController < ApplicationController
  before_filter :find_user

  protected
  def find_user
    @user = User.find_by_email(params[:email])
    # here you could add some exception handling and prevent execution of action if no user is found (assuming you want to do this)
  end

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多