【问题标题】:More-efficient way to pass the Rails params hash to named route将 Rails 参数哈希传递给命名路由的更有效方法
【发布时间】:2011-06-01 09:19:39
【问题描述】:

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

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

# adds the company filter
link_to_unless params[:company]==company, company, jobs_path(:company=>company, :posted=>params[:posted],:sort=>params[:sort],:dir=>params[:dir])

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

# create a link that removes the company filter
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 )

我希望有一些 DRYer 替代品。

【问题讨论】:

  • 没有路由匹配 {:dir=>'ASC',...}

标签: hash ruby-on-rails-3 params symbols named-routing


【解决方案1】:

重构了辅助函数:

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]}
    # add the contents of hash, overwriting entries with duplicate keys 
    o.merge!(hash)
end

重构视图代码以传递哈希而不是键/值对;更大的灵活性:

<%= link_to_unless params[:employer]==employer, employer, jobs_path( options({:employer=>employer}) ) %>

<%= link_to_unless_current '✗', jobs_path( options({:employer=>nil}) ) %>

【讨论】:

    【解决方案2】:

    这种方法有效,但似乎不是最优的:

    帮手:

    def options(key, value)
        # create a hash of all params
        o={:employer=>params[:employer],:posted=>params[:posted],:starting=>params[:starting],:sort=>params[:sort],:dir=>params[:dir]}
        # set value
        o[key]=value
        # return hash
        o
    end
    

    查看:

    # 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 哈希,但这暂时可以使用。

    【讨论】:

      【解决方案3】:

      重构版本。把它放在目标控制器中,这样它就不会是全局的:

      # new_params: new parameters you wish to pass on
      # white_list: array of symbols, representing additional keys from existing params which you wish to pass on
      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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-12-07
        • 2020-07-24
        • 1970-01-01
        • 2019-04-10
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多