更高效的方式将Rails params哈希传递给命名路由

15 浏览
0 Comments

更高效的方式将Rails params哈希传递给命名路由

我需要一种更高效的方式将params哈希传递给一个命名路由,包括添加/删除/修改键值对的能力。

添加一个键(:company符号),同时保留params哈希的其余部分(手动指定每个符号/值):

# 添加公司过滤器
link_to_unless params[:company]==company, company, jobs_path(:company=>company, :posted=>params[:posted],:sort=>params[:sort],:dir=>params[:dir])

删除一个键(删除:company符号),同时保留params哈希的其余部分(手动指定每个符号/值):

# 创建一个删除公司过滤器的链接
link_to_unless_current 'x', jobs_path(:posted=>params[:posted],:sort=>params[:sort],:dir=>params[:dir])

我想过直接传递params哈希,但会抛出异常:

link_to_unless params[:company]==company, company, jobs_path( params )

我希望有一些更DRY的替代方案。

0
0 Comments

更高效的方法将Rails参数哈希传递给命名路由

在Rails开发中,我们经常需要将参数传递给命名路由。然而,传递参数时可能会遇到一些问题,导致代码效率低下。本文将介绍一个更高效的方法来传递Rails参数哈希给命名路由,并提供解决方案。

问题的出现原因是在传递参数时,可能需要额外的步骤来处理参数,这可能会导致代码冗长和效率低下。例如,在原始版本中,我们需要手动从现有的参数中选择要传递的键,并将其合并到新的参数哈希中。这种方法不仅繁琐,而且容易出错。

为了解决这个问题,我们可以使用下面的重构版本代码。将它放在目标控制器中,以避免全局范围的影响。

# new_params: 要传递的新参数
# white_list: 一个包含要从现有参数中传递的其他键的符号数组
def options(new_params, white_list = [])
  white_list += [ :employer,:location,:posted,:starting,:sort,:dir,:fav ]
  white_list.uniq!
  new_params.reverse_merge( params.slice(white_list) )
end
helper_method :options

在这个重构版本中,我们定义了一个名为"options"的方法,它接受新参数和一个白名单数组作为参数。白名单数组中的键表示我们希望从现有参数中传递的其他键。我们首先将默认的白名单数组与传入的白名单数组合并,并确保白名单数组中的键是唯一的。

然后,我们使用"slice"方法从现有参数中选择白名单中的键,并使用"reverse_merge"方法将新参数与选择的参数合并。这样,我们就可以将参数哈希传递给命名路由,同时保持代码的简洁和高效。

最后,我们使用"helper_method"将"options"方法设置为helper方法,以便在视图中可以直接调用该方法。

通过使用这个更高效的方法,我们可以避免手动选择参数键并合并参数哈希的繁琐步骤,提高代码的效率和可读性。

总结起来,本文介绍了一个更高效的方法来传递Rails参数哈希给命名路由。通过定义一个"options"方法并使用"slice"和"reverse_merge"方法来处理参数,我们可以避免冗长和低效的代码。这个方法提高了代码的效率和可读性,使我们的开发工作更加轻松。

0
0 Comments

问题的出现原因:

这个问题的出现是因为作者想要将Rails的params哈希传递给命名路由,但是他发现传递params哈希的方法并不高效。作者使用了一个helper方法来创建一个包含所有params的哈希,并根据需要修改其中的值。然后在视图中调用这个helper方法来传递哈希给命名路由。虽然这种方法可以正常工作,但并不是最优解决方案。

解决方法:

为了更高效地将Rails的params哈希传递给命名路由,可以直接使用params哈希,而不是创建一个新的哈希并逐个添加或修改键值对。下面是修改后的代码:

helper:

def options(key, value)
  # set value directly in params hash
  params[key] = value
  # return params hash
  params
end

view:

# change symbol's value
<%= link_to_unless params[:employer] == employer, employer, jobs_path(options(:employer, employer)) %>
# remove symbol
<%= link_to_unless_current '✗', jobs_path(options(:employer, nil)) %>

这样,通过直接修改params哈希的值,就能更高效地将其传递给命名路由。

0
0 Comments

在上述代码中,出现了一个问题:如何更高效地将Rails的params哈希传递给命名路由。问题的出现是因为原来的帮助函数和视图代码在处理和传递params哈希时存在一些冗余和不必要的代码。为了解决这个问题,进行了以下的重构。

在帮助函数中,使用了一个新的参数hash,其中包含了需要传递给命名路由的键值对。通过使用merge!方法,将hash的内容合并到o哈希中,并覆盖了具有重复键的条目。这样做可以将params哈希和额外的参数合并到一个哈希中。

在视图代码中,通过调用options方法并传递一个包含所需参数的哈希,来重构了link_to_unless和link_to_unless_current方法。这样做可以更灵活地传递params哈希,并且可以通过添加或修改哈希中的键值对来传递不同的参数。

通过上述的重构,可以更高效地传递Rails的params哈希给命名路由,减少了冗余和不必要的代码,并提供了更大的灵活性。

以下是重构后的帮助函数和视图代码的整理结果:

# 重构后的帮助函数
def options(hash)
    o = {
      employer: params[:employer],
      location: params[:location],
      posted: params[:posted],
      starting: params[:starting],
      sort: params[:sort],
      dir: params[:dir],
      fav: params[:fav]
    }
    # 添加hash的内容,覆盖具有重复键的条目
    o.merge!(hash)
end
# 重构后的视图代码
<%= link_to_unless params[:employer] == employer, employer, jobs_path(options({employer: employer})) %>

通过以上的重构,我们可以更高效地传递Rails的params哈希给命名路由,减少了冗余和不必要的代码,并提供了更大的灵活性。

0