Ruby on rails 擦干这段Rails/Ruby代码
我如何干燥(不要重复你自己)/分解以下代码。我觉得我能做到,但因为我是一个新手,我没能做到 /app/controllers/application_controller.rbRuby 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|
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