如何在视图的URL中隐藏参数?

时间:2019-02-12 17:25:50

标签: ruby-on-rails parameters ruby-on-rails-5

我通过link_to将变更ID作为参数传递:

<%= link_to 'Change', my_service_path(change: '1234567890'), method: :get%>

在控制器中,我有:

def my_action
   if params[:change]
     ...
     params.delete :change
end

但是当显示view时,我仍然看到 <view url>?change=1234567890

如何防止?change=1234567890在网址中显示?

3 个答案:

答案 0 :(得分:1)

这是因为paramsActionController::Parameters的一个实例,它是专门创建的,因为人们在尝试将params对象当作哈希来处理时。

按照@arieljuod的建议,您必须将路由/链接转换为使用POST请求而不是GET请求。这样,参数将与HTTP标头一起发送,而不是作为查询字符串显示在URL栏中。

所以在您的情况下:

<%= link_to 'Change', my_service_path(change: '1234567890'), method: :post %>

...并确保您的路由已配置为响应POST请求

答案 1 :(得分:1)

您正在尝试做的“更改”对我说,您正在尝试修改资源的状态。在RESTful设计中,您应该PATCH,而不是GET

隐藏参数的方法是创建一个表单,将change放在一个隐藏字段中,然后使用button_tag将该表单作为PATCH请求提交。

在Slim中,它看起来像这样:

= form_tag(url: my_service_url, method: :patch) do
  = hidden_field_tag(:change, "123456789")
  = submit_tag("Change")

在您的网站上,它看起来就像一个常规链接-但是,您是在指示Rails服务器编辑资源,而不是获取资源。

答案 2 :(得分:1)

在评论中回答您的问题:

  

如何使用POST或表单阻止查询参数显示在> url中?

如果您发送POST请求,那么您的请求也会有一个正文。因此,在来自您的链接的GET请求中,将通过url发送更改信息。在POST请求(使用button_to或表单)中,它将通过正文发送,而不显示在url中。然后您仍然可以通过参数访问它