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/Ruby代码_Ruby On Rails_Ruby_Ruby On Rails 3_Dry - Fatal编程技术网

Ruby on rails 擦干这段Rails/Ruby代码

Ruby on rails 擦干这段Rails/Ruby代码,ruby-on-rails,ruby,ruby-on-rails-3,dry,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|

我如何干燥(不要重复你自己)/分解以下代码。我觉得我能做到,但因为我是一个新手,我没能做到

/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

好吧,既然你的
:注册
:帐户更新
的方法在
“user”
else
案例中是完全相同的,我不知道你为什么这样划分它。唯一的区别是在每种情况下为块变量指定不同的名称(
u
c
),但这不会改变行为

因此:


有关该方法的进一步简化定义,请参见@urigassi的答案。

@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

我和其他所有人都在讨论有条件的(不知道是为了什么),因此我提出了以下建议:

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

大多数情况下,他们只是把事情分解成自己的方法。我发现,当我很好地执行单一责任时,编写枯燥的代码要容易得多,也很自然。

如果/否则我认为这两个条件没有区别,请删除。如果你是对的,我的答案可能会更枯燥:)+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