在Link_to中传递参数

13

我想通过Rails中的link_to方法传递一个参数。我知道可以通过URL来实现,但我真的不想这样做。有没有办法在不将参数添加到链接本身的情况下通过链接传递参数?

我知道在PHP中可以使用post变量发布并检索该值。Rails中是否有类似的东西?

4个回答

12

link_to 的函数签名如下:

link_to(body, url_options = {}, html_options = {})

那么,POST请求将如下所示(假设您想要提交用户数据):

link_to "Link text", some_path(:foo => "bar", :baz => "quux"), user: @user, :method => :post

可以在控制器中使用params[:user]来检索用户的数据。


5
以下是如何通过link_to方法传递参数,以创建具有预定义属性的新对象。这种策略允许您在控制器中的操作之间传递变量并创建对象:
假设在您的show视图中,您有一个名为@foo的变量,您想将其传递给您的new控制器操作。在这种情况下,在您的show视图中,您可以使用link_to方法:
<%= link_to "Link Text", new_widget_path(:foo => @foo) %>

这段文字描述了一个功能,使用它可以将 @foo 存储在 params[:foo] 中,让你在控制器中使用 params[:foo]。取决于 *new_widget_path*,你将被引导到 WidgetController 中的“new”操作。点击“Link Text”将指导 Rails 调用你的 WidgetController 的“new”操作。
def new
  @widget = Widget.new(:foo => params[:foo])
end

然后,在您的 new.html.erb 视图文件中,您可以通过一个隐藏的表单字段允许用户创建一个新的 Widget 对象,并填充预定义的 foo 属性:
 <%= form_for(@widget) do |f| %>
  <%= f.label :other_attribute %><br />
  <%= f.text_field :other_attribute %>
  <%= f.hidden_field :foo %>
  <%= f.submit %>
<% end %>

允许用户创建一个带有填好了 foo 属性的新小部件!

1
这个解决方案令人惊叹的地方在于它非常详细和清晰地解释了问题。非常感谢您的发布。一年后仍然很有用。 - camdixon
这个例子仍然没有展示如何在点击link_to后,在到达新页面的表单之前“隐藏”url中的params。 - Katarzyna

3
通过 web 请求传递信息可以通过 URL 来实现: http://example.com/foo?bar=blah,这是 link_to 所做的 GET 请求;或者通过通常需要表单的 POST 操作。如果您只想要一个提交按钮,则表单可以有隐藏元素。
<form method="POST" action="http://example.com/foo">
  <input type="hidden" name="bar" value="blah">
  <input type="submit">
</form>

如果需要构建表单,有各种rails助手可供使用。

最后,如果你真的需要一个链接,你可以使用CSS样式化按钮,或者使用JavaScript观察链接,然后POST信息。(Simon Bagreev发布的方法使用JavaScript实现了这一点)


谢谢。我无法弄清楚为什么Simon Bagreev的解决方案会起作用。现在,我必须在CSS或JavaScript中寻找解释。 - Katarzyna

1
什么样的参数?如果它是GET请求的键,惯例会使用URL(例如params[:id]或活动记录路径变量)。如果您想要POST一些内容,应该使用表单。否则,您可以编写一个帮助程序来设置会话变量或其他内容,但请考虑您的架构以及您正在尝试做什么,我相信这里的某个人可以帮助您。

本质上它是一个GET请求,所以我应该不要做我想做的事情,而是遵循惯例。目前,我的路由相当嵌套--已经在URL中使用了大约6个段。我试图避免使用URL来添加另外几个段。 - Kyle

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接