我有一个带有操作send_file
的控制器querys
。querys_controller.rb
def send_file
send_data(params[data], :filename => "query.txt")
end
在html.erb中,我有:
<%=link_to "send data", :controller=>"querys", :action=>"send_file", :data=>@mat, method: :post%>
通过单击"发送数据"栏,我可以看到"错误请求",因为@mat是一个二维数组,似乎我link_to无法发送这样的结构。如何将矩阵发送到控制器?
@mat:
[["1681", "", "02.05.1955"], ["1680", "", "02.03.1936"], ["1679", "", "26.11.1938"], ["1692", "", "15.05.1958"]]
@Tonja,对我来说,你在做什么似乎很奇怪。首先,你在某个地方生成一个数组,然后再次使用浏览器将其传递回您的应用程序。然后您以文本格式将其发送回浏览器?不应将此数组传递给用户,而应将其保留在服务器上。只需将其存储在数据库中即可。不要将数据传递给用户,只有在绝对必要的情况下。您当前的实现还强制您对传递的数据进行相当多的检查。
在生成 html.erb 的控制器方法中,将@mat实例存储在某个位置,并获取记录的 ID。将此 ID 传递给link_to,并将数据库中的此数据用作send_data调用的参数。
(小提示:实际上不要使用 ID,这不安全,而是使用随机值。甚至更好:如果可以将值附加到current_user),则根本不传递任何内容)。
您收到错误请求是因为 Rails 不理解您请求的格式。那是因为你自己组装了网址。使用类似
link_to "send file", send_file_querys_path(format: :txt)
甚至
button_to ....
如果是开机自检操作。
您可以使用"耙子路线"获取有效路线。这使你的应用更易于测试。
我希望我的回答能帮助你重新设计你的代码。如果你正在做的事情是正确的方式,那么@m_x给了你正确的指示。
此致敬意
雨 果
以哈希形式传递 url 参数时,应将它们与 link_to
的其余参数分开:
<%
= link_to "send data",
{controller: "querys", action: "send_file", data: @mat},
method: :post
%>
但是,这会将数据作为查询参数传递。如果您确实想将数据作为 POST 参数传递(例如,如果@mat
包含大量数据),则必须使用带有隐藏字段和提交按钮的表单标记。
IMO 更有效的方法是传递填充@mat
所需的参数,重新填充变量服务器端并在send_file
中使用它。
这方面的最佳实践是利用rails的format
功能,例如:
def some_action
@mat = populate_mat(params)
respond_to do |format|
format.html
format.txt do
send_data(@mat, :filename => "query.txt")
end
end
end
(注意:为此,您可能需要在 config/initializers/mime_types.rb
中注册 txt
MIME 类型)
那么在some_action.html.erb
:
<% = link_to "send data", {format: :txt}, class: 'whatever' %>
这将只在当前 url 的末尾添加一个.txt
扩展名,它与 REST 范式(每个资源一个端点,扩展名指示所需的表示形式)很好地配合使用。
您还可以将 format
选项传递给任何 url 帮助程序,例如:
<%= link_to "root", root_path(format: :txt), class: 'whatever' %>
试试这个:
link_to("Send data", send_file_querys_path(data: @mat), method: :post)