0

我是 Rails 新手,遇到过这个问题。

我有一个 books_controller,我在其中定义了一个名为下载的新操作:

def download
  @book = Book.find(params[:id])

  return send_file @book.get_filepath, :type => 'application/pdf', :filename => @book.get_filename
end

我的 routes.rb 就像:

resources :books
match '/books(/download(/:id))', :controller => "books", :action => "download"

我想创建一个类似 /books/download/10 的 URL 来调用下载操作。

我不确定如何创建该链接。我曾尝试阅读有关路由的 Rails 指南,但对此感到非常困惑。

我努力了

<td><%= link_to books_download_path(book) %></td>

它显然不起作用。

undefined method `books_download_path' for #<#<Class:0x682ac40>:0x482cad8>

我很感激这方面的任何帮助。

谢谢

PS 也许 /books/10/download 比 /books/download/10 更有意义

index.html.erb

<table>
<% @recent_books.each do |book| %>
    <tr>
        <!-- <td><%= image_tag(book.get_thumbnail) %></td> -->
        <td><%= truncate(book.get_title, :length => 30) %></td>
        <td><%= book.get_author %></td>
        <td><%= book.get_summary %></td>
        <td><%= truncate(book.get_filename, :length => 30) %></td>
        <!-- <td><%= link_to 'Download', book %></td> -->
        <td><%= link_to "Download", download_book_path(book) %></td>
    </tr>
<% end %>
<table>

路线.rb

Caliberator::Application.routes.draw 做资源 :authors

resources :books do
  get :download, :on => :member, :to => 'books#download'
end

结尾

4

4 回答 4

2

对于 Rails 3,试试这个

resources :books do
  get :download, :on => :member, :to => 'books#download'
end

现在,在您看来,您可以使用。

<%= link_to 'Download', download_book_path(book) %>

这将生成books/10/download类型链接。

于 2012-08-03T05:57:48.057 回答
0

尝试关注

match '/books(/download(/:id))', :controller => "books", :action => "download", :as => "books_download"

参考:-naming_routes

于 2012-08-03T05:57:17.720 回答
0

对于 rails 3,你应该写:

resources :books do
  member do
    get 'download'
  end
end
于 2012-08-03T12:48:04.523 回答
0

你必须这样做:

<%= link_to "Download", download_books_path + "/#{book.id}" %>
于 2012-08-03T06:03:17.520 回答