Rieles: uso de formulario (selección de colección) para llamar a show-action
-
19-08-2019 - |
Pregunta
Se da un modelo llamado 'libro' con los atributos 'nombre' e 'id'. ¿Cómo puedo usar esta colección select para llamar a la acción show de un determinado libro? El código mencionado a continuación devuelve el siguiente mensaje de error:
No se pudo encontrar el libro con 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 %>
Solución
book_path
se genera una sola vez, para la etiqueta de formulario en sí. No se actualizará cuando cambie su selección.
Cuando envíe ese formulario, solicitará la siguiente URL:
/books/book_id?book[id]=5
Dado que su book_path
cree que book_id es el número de identificación que desea, intenta buscarlo. Puede hacer lo que quiera cambiando el código en su controlador de:
@book = Book.find(params[:id])
a:
@book = Book.find(params[:book][:id])
Pero huele mal, así que ten cuidado.
Otros consejos
Puede crear una nueva ruta que no se base en la identificación, como
get 'books/show' # put this above your "resources :books"
y cambie su formulario a
<% form_tag books_show_path, :method => :get %>