Rails link_to URL和HTML选项与remote:true

时间:2014-04-09 14:13:06

标签: ruby-on-rails ruby ajax link-to

我目前的链接

link_to title, params.merge(:sort => column, :direction => direction, :page => nil, :search => nil), {class: css_class}

我想在混合中添加remote: true,但是当我用params.merge(即{params.merge(), remote: true}将其加密时,我会收到语法错误。在rails中我需要封装url选项和单独的html选项对吗?

titlecss_class都是此链接所在的辅助方法中的变量

3 个答案:

答案 0 :(得分:2)

最好使用:

link_to 'title', params.merge(:sort => column, :direction => direction, :page => nil, :search => nil), {class: css_class}, :remote => true

答案 1 :(得分:1)

你可以这样做:

link_to title, params.merge(:sort => column, :direction => direction, :page => nil, :search => nil), class: css_class, remote: true

答案 2 :(得分:0)

在Rails 5中,ActionController::Parameters不再继承自Hash,以阻止人们在请求参数上使用与Hash相关的方法,而无需对其进行显式过滤。

作为此拉取请求的一部分,该请求已回传到Rails 5.1中,部分又回传到Rails 5.0中,如果您尝试在参数对象上调用to_h而不调用允许,则会引发异常。

在原始params对象(merge)上调用params.merge(:sort => column, :direction => direction, :page => nil)会返回一个具有相同允许状态(即尚未对其上进行调用)的新ActionController::Parameters对象。然后link_to方法最终在该对象上调用to_h,这引发了异常。

如果您知道链接中应允许使用哪些参数,则可以使用列出的参数调用允许。

params.permit(:param_1, :param_2).merge(:sort => column, :direction => direction, :page => nil)
# OR
params.merge(:sort => column, :direction => direction, :page => nil).permit(:param_1, :param_2, :sort, :direction, :page)

如果您不知道链接中可以包含哪些参数,则可以调用request.parameters.merge(...)(如本答案所述)或params.to_unsafe_h.merge(...)。但是,正如注释中指出的那样,当将结果传递给link_to时,这会带来安全风险,因为像host这样的参数将被解释为链接的实际主机,而不是查询参数。在link_to(url_for接受的所有内容以及:method)中,还有其他几个键也具有特殊含义,因此通常这是一种冒险的方法。