重构相似的方法重定向不同的 Rails
Refactor Similar Methods Redirects Different Rails
我想就如何重构一些代码以使其更 DRY 获得一些建议,因为 Rails 非常关注 DRY。在我的控制器中,我有一些这样的方法:
def filter
if params[:status] == "All" && params[:department] == "All"
redirect_to admin_organizations_path
elsif params[:status] != "All" && params[:department] == "All"
redirect_to admin_organizations_path(status: params[:status])
elsif params[:status] == "All" && params[:department] != "All"
redirect_to admin_organizations_path(department: params[:department])
else
redirect_to admin_organizations_path(status: params[:status], department: params[:department])
end
end
def filter_manage
if params[:status] == "All" && params[:department] == "All"
redirect_to manage_organizations_path
elsif params[:status] != "All" && params[:department] == "All"
redirect_to manage_organizations_path(status: params[:status])
elsif params[:status] == "All" && params[:department] != "All"
redirect_to manage_organizations_path(department: params[:department])
else
redirect_to manage_organizations_path(status: params[:status], department: params[:department])
end
end
def filter_index
if params[:department] == "All"
redirect_to organizations_path
else
redirect_to organizations_path(department: params[:department])
end
end
def filter_user
if params[:department] == "All"
redirect_to user_organizations_path
else
redirect_to user_organizations_path(department: params[:department])
end
end
如您所见,唯一真正的区别是它们重定向回的位置,如何将其变成可重复使用的代码段,智能地知道在给定视图来自的情况下重定向回何处,因为这些方法只是重定向回它们来自的视图。
非常感谢任何帮助!
我相信你可以这样做:
def filter(flag)
if params[:status] == "All" && params[:department] == "All"
myparams = {}
elsif params[:status] != "All" && params[:department] == "All"
myparams = {status: params[:status]}
elsif params[:status] == "All" && params[:department] != "All"
myparams = {department: params[:department]}
else
myparams = {status: params[:status], department: params[:department]}
end
## flag = 0 -> manage_organizations_path
## flag = 1 -> admin_organizations_path
if flag
admin_organizations_path(myparams)
else
manage_organizations_path(myparams)
end
end
您可以通过简单地迭代参数散列并仅保留那些与测试匹配的参数来简化此过程:
def filter_params(*keys)
params.slice(keys).keep_if do |key, value|
value.present? && value != "All"
end
end
def filter
redirect_to admin_organizations_path(filter_params(:status, :department))
end
def filter_manage
redirect_to admin_organizations_path(filter_params(:status, :department))
end
def filter_index
redirect_to organizations_path(filter_params(:department))
end
def filter_user
redirect_to user_organizations_path(filter_params(:department))
end
我想就如何重构一些代码以使其更 DRY 获得一些建议,因为 Rails 非常关注 DRY。在我的控制器中,我有一些这样的方法:
def filter
if params[:status] == "All" && params[:department] == "All"
redirect_to admin_organizations_path
elsif params[:status] != "All" && params[:department] == "All"
redirect_to admin_organizations_path(status: params[:status])
elsif params[:status] == "All" && params[:department] != "All"
redirect_to admin_organizations_path(department: params[:department])
else
redirect_to admin_organizations_path(status: params[:status], department: params[:department])
end
end
def filter_manage
if params[:status] == "All" && params[:department] == "All"
redirect_to manage_organizations_path
elsif params[:status] != "All" && params[:department] == "All"
redirect_to manage_organizations_path(status: params[:status])
elsif params[:status] == "All" && params[:department] != "All"
redirect_to manage_organizations_path(department: params[:department])
else
redirect_to manage_organizations_path(status: params[:status], department: params[:department])
end
end
def filter_index
if params[:department] == "All"
redirect_to organizations_path
else
redirect_to organizations_path(department: params[:department])
end
end
def filter_user
if params[:department] == "All"
redirect_to user_organizations_path
else
redirect_to user_organizations_path(department: params[:department])
end
end
如您所见,唯一真正的区别是它们重定向回的位置,如何将其变成可重复使用的代码段,智能地知道在给定视图来自的情况下重定向回何处,因为这些方法只是重定向回它们来自的视图。
非常感谢任何帮助!
我相信你可以这样做:
def filter(flag)
if params[:status] == "All" && params[:department] == "All"
myparams = {}
elsif params[:status] != "All" && params[:department] == "All"
myparams = {status: params[:status]}
elsif params[:status] == "All" && params[:department] != "All"
myparams = {department: params[:department]}
else
myparams = {status: params[:status], department: params[:department]}
end
## flag = 0 -> manage_organizations_path
## flag = 1 -> admin_organizations_path
if flag
admin_organizations_path(myparams)
else
manage_organizations_path(myparams)
end
end
您可以通过简单地迭代参数散列并仅保留那些与测试匹配的参数来简化此过程:
def filter_params(*keys)
params.slice(keys).keep_if do |key, value|
value.present? && value != "All"
end
end
def filter
redirect_to admin_organizations_path(filter_params(:status, :department))
end
def filter_manage
redirect_to admin_organizations_path(filter_params(:status, :department))
end
def filter_index
redirect_to organizations_path(filter_params(:department))
end
def filter_user
redirect_to user_organizations_path(filter_params(:department))
end