无法 link 使用 link_to 更正路线

Can't link to correct route using link_to

我正在尝试link到现有路线/clients/:client_id/invoices/:id 来自我的 /clients/:client_id show 页面,但不知道如何操作。

我有 has_many through: 关系,这是我的 models

class Client < ActiveRecord::Base
has_many :invoices
has_many :items, through: :invoices

class Invoice < ActiveRecord::Base
belongs_to :user
belongs_to :client
has_many :items, :dependent => :destroy

accepts_nested_attributes_for :items, :reject_if => :all_blank, :allow_destroy => true

class Item < ActiveRecord::Base
belongs_to :invoice
belongs_to :client

我的路线

resources :clients do
resources :invoices
end
resources :invoices

我的客户端控制器显示动作

def show
@client = Client.find(params[:id])
@invoices = @client.invoices.build
end

还有我的客户show.html.erb

<div class="panel-body">
        <table class="table table-hover">
          <thead>
            <tr>
              <th>Sender</th>
              <th>Reciever</th>
              <th>Amount</th>
              <th>Currency</th>
              <th>Date</th>
              <th colspan="3"></th>
            </tr>
          </thead>              
          <tbody>              
          <% @client.invoices.each do |invoice| %>
              <tr>
                <td><%= invoice.sender %></td>
                <td><%= invoice.reciever %></td>
                <td><%= invoice.amount %></td>
                <td><%= invoice.currency %></td>
                <td><%= invoice.date %></td>
                <td><%= link_to 'Show', invoices_path(@clients, @invoice) %></td>
              </tr>                
          <% end %>  
          </tbody>
        </table>
      </div>

每次我点击 link_to show 它会将我转到 /invoices 我尝试了很多不同的 link_to 格式,但我一直无法弄清楚。

您使用了错误的 url_helper 和错误的参数。你应该有:

<td><%= link_to 'Show', client_invoice_path(@client, invoice) %></td>

<td><%= link_to 'Show', invoice_path(invoice) %></td>

invoices_path 是由 resources :invoices(最外面的那个)生成的 url_helper,会将您路由到 InvoicesController (/invoices) 的索引路径。如果您传递参数,它将用于格式(/invoices.10 - 很常见的问题)。

嵌套resources生成的所有路由都有一个由两种资源组成的名称,如new_user_profile_pathclient_invoice_type_path(三重嵌套)。

请注意,您当前的路由结构(具有两个不同路径的相同资源)可能会使您的控制器逻辑更加复杂。通常只有一条路线就够了,挑一条。