在Rails中通过GET请求传递数组参数是一个常见的需求,但需要遵循特定的格式要求。以下是完整的解决方案:
Rails的GET请求参数通过URL的查询字符串传递,默认情况下参数会被解析为字符串。要传递数组,需要使用Rails约定的参数命名格式。
正确的数组参数传递方式是在参数名后添加[]
:
?tags[]=ruby&tags[]=rails&tags[]=web
这会被Rails解析为:
params[:tags] # => ["ruby", "rails", "web"]
// 使用URLSearchParams构建查询字符串
const params = new URLSearchParams();
['ruby', 'rails', 'web'].forEach(tag => {
params.append('tags[]', tag);
});
// 最终URL
const url = `/search?${params.toString()}`;
class SearchController < ApplicationController
def index
@tags = params[:tags] || []
# @tags 现在是数组形式
end
end
<%= form_with url: search_path, method: :get do |f| %>
<%= hidden_field_tag 'tags[]', 'ruby' %>
<%= hidden_field_tag 'tags[]', 'rails' %>
<%= submit_tag 'Search' %>
<% end %>
问题1:参数被解析为字符串 错误格式:
?tags=ruby,rails,web
结果:
params[:tags] # => "ruby,rails,web" (字符串)
解决方案:
改用tags[]
格式传递
问题2:数组元素包含特殊字符 URL会对特殊字符编码,Rails会自动解码。如需手动处理:
# 编码
CGI.escape('ruby on rails') # => "ruby+on+rails"
# 解码
URI.decode_www_form_component("ruby+on+rails") # => "ruby on rails"
?user[tags][]=frontend&user[tags][]=backend
解析为:
params[:user][:tags] # => ["frontend", "backend"]
Rails参数对象支持符号和字符串键访问:
params[:tags] == params['tags'] # => true
permit
方法进行参数白名单过滤:params.permit(tags: [])
这种参数传递方式在Rails中广泛用于过滤、搜索和多选等场景,是Rails参数解析的标准特性之一。
没有搜到相关的文章