goda
goda

Reputation: 196

Passing a delete method with params

<% @books.each do |book| %>
      <% unless book.checkout_user_id == nil %>
        <%= link_to "delete checkout", book_checkout_path(book_id: book.id), :confirm => 'Are you sure?', :class => "button", :method => :delete %>
      <% end %>
<% end %>

In the above code, I want to pass a parameter to my book_checkout controller. How can I make it so my destroy method will retrieve the :book_id passed in from book_checkout_path.

Then create an instance to search for a checkout with the corresponding book_id attribute rather than search by ID.

  def destroy
    @book_checkout = BookCheckout.where(book_id: book_id).first # this line is wrong
    @book_checkout.destroy

    redirect_to books_path
  end

EDIT: Added routes. routes:

   book_checkout GET    /book_checkouts/:id(.:format)      book_checkouts#show
                 PATCH  /book_checkouts/:id(.:format)      book_checkouts#update
                 PUT    /book_checkouts/:id(.:format)      book_checkouts#update
                 DELETE /book_checkouts/:id(.:format)      book_checkouts#destroy

Upvotes: 1

Views: 7183

Answers (2)

B Seven
B Seven

Reputation: 45943

@book_checkout = BookCheckout.find_by(book_id: params[:book_id])

Since the route only has one id, I think you can use

book_checkout_path(book.id)

However, it seems strange to use the Book id to find the BookCheckout. Is there any special reason you can't do:

book_checkout_path(book_checkout.id)

and

@book_checkout = BookCheckout.find_by(id: params[:id])

Also, is it possible that both the Book id and the Book Checkout id are the same (1)? This would make it appear to succeed when it shouldn't.

Upvotes: 1

goda
goda

Reputation: 196

I had to fix my original code for a workaround, but it isn't the cleanest.

<%= link_to "delete checkout", book_checkout_path(id: book.id, check: book.id), :confirm => 'Are you sure?', :class => "button", :method => :delete %>

My original link_to NEEDS to pass id because my routes expect that, so I added a check which passes the attribute i will need.

@book_checkout = BookCheckout.find_by(book_id: params[:check])

In my checkout controller, I used the params[:check] instead of params[:id], because I cannot overwrite params[:id] with the book.id.

Upvotes: 1

Related Questions