重构相似的方法重定向不同的 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