【问题标题】:How do I route to a new rails controller action如何路由到新的 Rails 控制器操作
【发布时间】:2012-08-01 03:45:40
【问题描述】:

我是 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>

如果能提供任何帮助,我将不胜感激。

谢谢

附:也许 /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>

routes.rb

Caliberator::Application.routes.draw 做 资源:作者

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

结束

【问题讨论】:

    标签: ruby-on-rails routing routes


    【解决方案1】:

    对于 rails 3,你应该写:

    resources :books do
      member do
        get 'download'
      end
    end
    

    【讨论】:

      【解决方案2】:

      你必须这样做:

      <%= link_to "Download", download_books_path + "/#{book.id}" %>
      

      【讨论】:

        【解决方案3】:

        对于 Rails 3,试试这个

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

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

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

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

        【讨论】:

        • 我已经更新了我的路线,说资源 :books resources :books do get :download, :on => :member, :to => "books#download" end 我的观点是 但是,当我去 /books 时,我得到 No route matches {:controller=>"books", :action=>"download"} 但是,rake routes 显示 download_book GET /books/:id /download(.:format) books#download 我现在更困惑了:(我做错了什么?
        • 您在我建议的代码上方添加了resources :books。删除resources :books 行并重试。
        • 嗨,Kulbir,删除资源:books 没有帮助,我仍然在 /books 上收到相同的消息
        • 这很奇怪。您可以尝试重新启动您的 Rails 服务器,以防万一吗?如果它仍然不起作用,请使用 index.html.erb 和 routes.rb 内容更新您的问题。
        • 为了测试,将下载代码的链接添加到您图书的show.html.erb 并尝试浏览图书的展示页面。我感觉,你的收藏有问题@recent_books。
        【解决方案4】:

        尝试关注

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

        参考:-naming_routes

        【讨论】:

        • 或者只是match '/books/:id/download', "reviews#download", :as =&gt; "books_download"
        • 我得到 No route matches {:controller=>"books", :action=>"download"}
        • 哎呀对不起match '/books/:id/download', "books#download", :as =&gt; "books_download"
        • 是的,这就是我输入的内容。我已经用书籍替换了评论
        • 你重启你的服务器了吗??使用类似book = Book.first AND books_download_path(book)
        猜你喜欢
        • 1970-01-01
        • 2012-06-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-05-09
        • 1970-01-01
        • 2011-09-25
        • 1970-01-01
        相关资源
        最近更新 更多