在 Rails 中同时使用 2 个参数制作路线

Posted

技术标签:

【中文标题】在 Rails 中同时使用 2 个参数制作路线【英文标题】:Making routes with 2 params at the same time in Rails 【发布时间】:2014-05-13 22:11:02 【问题描述】:

我真的很纠结这个。我是新来的铁路。

我想创建一个双参数路由来通过 2 个属性过滤照片。 如果我按类别 1 可视化照片并单击区域 1,它应该同时显示类别 1 和区域 1 的照片。

示例: 我想同时查看具有类别属性:1 和区域属性:1 的照片。 我已经完成了:

照片控制器

`def type
     @photos = Photo.by_category(params[:category_id]).paginate(:page => params[:page])
     render :index
end

def zone
    @photos = Photo.by_zone(params[:zone_id]).paginate(:page => params[:page])
    render :index
end

def search
    @photos = Photo.with_user_avatar.all
    @photos = @photos.where('category = ?', params[:category_id]) if params[:category_id]
    @photos = @photos.where('zone = ?', params[:zone_id]) if params[:zone_id]
    @photos = @photos.paginate(:page => params[:page])
end`

Routes.rb

get 'spots/:category_id', to: "photos#type", as: :spots_category get 'spots/zonas/:zone_id', to: "photos#zone", as: :spots_zone get 'spots/:category_id/:zone_id', to: "photos#search", as: :spots_category_zone get 'spots/zonas/:zone_id/:category_id', to: "photos#search", as: :spots_zone_category

在我看来

`<section class="row semi_padding_top">
<aside id="sidemenu" class="large-3 columns">
        <a href="#" data-dropdown="drop1" data-options="align:right" class="button dropdown"></i>   Quiero ver spots de...</a><br>
            <ul id="drop1" data-dropdown-content class="f-dropdown" data-options="align:right">
                <li><%= link_to "Baños", spots_zone_path(1) %></li>
                <li><%= link_to "Cocinas", spots_zone_path(2) %></li>
                <li><%= link_to "Cuartos de estar", spots_zone_path(3) %></li>
                <li><%= link_to "Dormitorios", spots_zone_path(4) %></li>
                <li><%= link_to "Exteriores", spots_zone_path(5) %></li>
                <li><%= link_to "Hostelería", spots_zone_path(6) %></li>
                <li><%= link_to "Infantil", spots_zone_path(7) %></li>
                <li><%= link_to "Oficinas", spots_zone_path(8) %></li>
                <li><%= link_to "Salones", spots_zone_path(9) %></li>
            </ul>
        <h5 class="bold uppercase lightgrey">Estilos 
            <span class="green"><%= (@zone ? "para #@zone": "") %></h5></span>
                <ul class="listnone bold lightgrey">
                    <li><%= link_to "Moderno", spots_category_path(1, zone: @zone) %>
                    <span class="spot_count small right"><%= @photos.count %></span></li>
                    <li><%= link_to "Clásico", spots_category_path(2) %>
                    <span class="spot_count small right"><%= @photos.count %></span></li>
                    <li><%= link_to "Industrial & Loft", spots_category_path(3), zone: @zone %>
                    <span class="spot_count small right"><%= @photos.count %></span></li>
                    <li><%= link_to "Minimalista", spots_category_path(4), zone: @zone %>
                    <span class="spot_count small right"><%= @photos.count %></span></li>
                    <li><%= link_to "Rústico", spots_category_path(5) %>
                    <span class="spot_count small right"><%= @photos.count %></span></li>
                    <li><%= link_to "Contemporáneo", spots_category_path(6) %>
                    <span class="spot_count small right"><%= @photos.count %></span></li>
                    <li><%= link_to "Étnico", spots_category_path(7) %>
                    <span class="spot_count small right"><%= @photos.count %></span></li>
                    <li><%= link_to "Art Deco", spots_category_path(8) %>
                    <span class="spot_count small right"><%= @photos.count %></span></li>
                    <li><%= link_to "Ecléctico", spots_category_path(9) %>
                    <span class="spot_count small right"><%= @photos.count %></span></li>
                </ul>

</aside>
<%= render 'spotlist' %>

`

我不知道如何配置我的视图以显示双参数。

我已尝试使用 ,但没有成功。

谢谢!!!

【问题讨论】:

【参考方案1】:

Rails 将按照在您的路线中指定的顺序匹配参数。例如:

get 'spots/:category_id/:zone_id', to: "photos#search", as: :spots_category_zone

<%= link_to "Moderno", spots_category_zone_path(1, 'Moderno') %>

...将输出指向http://localhost:3000/spots/1/Moderno 的链接。您也可以明确指定它们:

<%= link_to "Moderno", spots_category_zone_path(category_id: 1, zone_id: 'Moderno') %>

或者你可以给它没有在路由中指定的参数,在这种情况下,它会将它们作为正常的?get= 值附加。

get 'spots/:category_id/:zone_id', to: "photos#search", as: :spots_category_zone
<%= link_to "Moderno", spots_category_zone_path(1, 'Moderno', foo: 'bar') %> 

...会给你http://localhost:3000/spots/1/Moderno?foo=bar

如果您出于某种原因想要乱序列出它们,明确指定它们会很有帮助。

<%= link_to "Moderno", spots_category_zone_path(zone_id: 'Moderno', foo: 'bar', category_id: 1) %> 

...仍然给你http://localhost:3000/spots/1/Moderno?foo=bar

在您的情况下,如果@zone == 'foo',则&lt;%= link_to "Moderno", spots_category_path(1, zone: @zone) %&gt; 返回http://localhost:3000/spots/1?zone=foo。您想使用spots_category_zone_path,如我的第一个示例所示..

【讨论】:

但问题是我需要动态路线,因为如果我正在使用类别“Moderno”可视化照片并希望看到类别为“Baños”的区域,路线应该知道我看到的是什么类别建立它的路线对吗?这就是为什么我不能明确地制作它们.. 我不确定我明白你在说什么。您是否在视图中从一个类别链接到另一个类别时遇到问题? 不,但是我如何告诉路线(在视图中的链接中)有一个动态参数,这是我看到的类别,所以它可以做到'spots/:category_im_seeing/:zone_i_want_to_filter' 这不是spots_category_zone_path 所做的吗? &lt;%= link_to "Moderno", spots_category_zone_path(1, 'Moderno') %&gt;?或者如果你想动态地做,比如&lt;%= link_to "Moderno", spots_category_zone_path(1, @object.category) %&gt;?这会给你spots/1/Moderno 或任何@object.category 是的,我的问题是关于视图中的链接。让我试试这个!

以上是关于在 Rails 中同时使用 2 个参数制作路线的主要内容,如果未能解决你的问题,请参考以下文章

错误的参数类型类(预期的模块)Rails 5 拆分路线

rails 6中没有针对多个路线参数的路线匹配

Rails 6 路线 - 如何添加自定义“新”路线?

无法在生产环境中解析的路线(Rails 2.3.5)

在路线中使用字母数字段而不是 id - Rails

升级到 Rails 6.1 后的 Rails 路线问题