我怎样才能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
的情况下完全是等效的,我不知道你为什么这样划分它。唯一的区别是在每种情况下给块变量一个不同的名称 (u
和c
),但这不会改变行为。
:
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代码要容易得多,也自然得多。