DRY这个Rails/Ruby代码



我怎样才能DRY(不要重复)/分解下面的代码呢?我觉得我能做这件事,但因为我是个新手,我做不了。

/app/controllers/application_controller.rb

 protected

    def configure_permitted_parameters
      if params[:controller] == "user"     
        devise_parameter_sanitizer.for(:sign_up) do |u|
          u.permit(:email, :password, :password_confirmation)
        end
        devise_parameter_sanitizer.for(:account_update) do |u|
          u.permit(:email, :password, :password_confirmation)
        end
      else # for clients access 
        devise_parameter_sanitizer.for(:sign_up) do |c|
          c.permit(:email, :password, :password_confirmation)
        end
        devise_parameter_sanitizer.for(:account_update) do |c|
          c.permit(:email, :password, :password_confirmation)
        end
      end
    end

@DanielKnippers给出了一个很好的答案,但是你可以像这样进一步DRY你的代码:

def configure_permitted_parameters
  [:sign_up, :account_update].each do |sanitize_me|
    devise_parameter_sanitizer.for(sanitize_me) do |u|
      u.permit(:email, :password, :password_confirmation)
    end
  end
end

好吧,因为你对:sign_up:account_update的方法在"user"else的情况下完全是等效的,我不知道你为什么这样划分它。唯一的区别是在每种情况下给块变量一个不同的名称 (uc),但这不会改变行为。

:

def configure_permitted_parameters
  devise_parameter_sanitizer.for(:sign_up) do |u|
    u.permit(:email, :password, :password_confirmation)
  end
  devise_parameter_sanitizer.for(:account_update) do |u|
    u.permit(:email, :password, :password_confirmation)
  end
end

请参阅@UriAgassi的回答,以获得该方法的进一步简化定义。

我和其他人一样对条件(不知道它是做什么的),所以我想到了这个:

def configure_permitted_parameters
  actions = [:sign_up, :account_update]
  actions.each{|action| sanitize_devise_param_for(action) }
end
def sanitize_devise_param_for(action, permitted = [:email, :password, :password_confirmation])
  devise_parameter_sanitizer.for(action) do |c|
    c.permit(permitted)
  end
end

大多只是把事情分解成自己的方法。我发现,当我很好地执行单个职责时,编写DRY代码要容易得多,也自然得多。

相关内容

  • 没有找到相关文章

最新更新