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 %>
¿Fue útil?

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 %>
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top