干这个Rails / Ruby代码

时间:2014-03-24 20:15:21

标签: ruby-on-rails ruby ruby-on-rails-3 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

3 个答案:

答案 0 :(得分:4)

好吧,既然: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的答案,以进一步简化该方法的定义。

答案 1 :(得分:4)

@DanielKnippers给出了一个很好的答案,但你可以进一步干掉你的代码:

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

答案 2 :(得分:1)

我和其他所有人谈论条件(不要看它是什么),所以我提出了这个:

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代码更容易,更自然,在我做好单一职责时做得很好。