【问题标题】:Rails: Using form (collection select) to call show-actionRails:使用表单(集合选择)调用 show-action
【发布时间】:2009-03-18 10:05:21
【问题描述】:

给出了一个名为“book”的模型,其属性为“name”和“id”。我如何使用这个集合选择来调用某本书的显示动作?下面提到的一个代码返回以下错误消息:

找不到 ID=book_id 的图书

<% form_tag(book_path(:book_id)), :method => :get  do %>
  <p>
  <%= label(:book, :id, 'Show Book:') %>
    <%= @books = Books.find(:all, :order => :name)
      collection_select(:book, :id, @books, :id, :name) 
  %> 
  </p>
  <p>
  <%= submit_tag 'Go' %>
  </p>
<% end %>

【问题讨论】:

    标签: ruby-on-rails actionview


    【解决方案1】:

    book_path 只生成一次,用于表单标签本身。只要您的选择发生变化,它就不会更新。

    当您提交该表单时,它将请求以下 URL:

    /books/book_id?book[id]=5
    

    由于您的book_path 认为 book_id 是您想要的 ID 号,因此它会尝试查找。您可以通过更改控制器中的代码来做您想做的事情:

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

    到:

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

    但它闻起来有点难闻,所以要小心。

    【讨论】:

    • 非常感谢卢克。对无臭解决方案有什么建议吗?我只需要一个下拉菜单来选择要显示的某本书...
    • 因为“臭味解决方案”会破坏使用 book_path(id) 对 show 操作的默认调用,不是吗?
    • 您可以尝试从任一字段中选择 ID,如下所示:@book = Book.find(params[:book].try(:[],:id) || params[:id ]) 那会起作用,但气味仍然存在,因为从技术上讲,您不应该使用这样的 RESTful 路由。平衡“完成”与“遵循惯例”。
    【解决方案2】:

    你可以创建一个不基于id的新路由,比如

    get 'books/show'    # put this above your "resources :books"
    

    并将您的表单更改为

    <% form_tag books_show_path, :method => :get %>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-08-31
      • 2016-12-19
      • 1970-01-01
      • 1970-01-01
      • 2013-06-18
      • 1970-01-01
      • 2017-01-22
      • 2014-10-21
      相关资源
      最近更新 更多