Маршруты
resources :favorites, only: [ :index, :create, :destroy ] , param: :listing_id
Рейк-маршруты
favorites GET /favorites(.:format) favorites#index
favorites POST /favorites(.:format) favorites#create
favorite DELETE /favorites/:listing_id(.:format) favorites#destroy
Заметьте (ы) в избранном, почему это не все избранное или избранное?
Я создаю одного фаворита и уничтожаю одного фаворита, поэтому я думаю, что он должен быть одинаковым в обоих.
Мне нужно
favorite POST /favorites/:listing_id(.:format) favorites#create
Я пробовал это в моих маршрутах:
resources :favorites, only: [ :index, :destroy
] , param: :listing_id
post 'favorites/:listing_id' => 'favorite#create', as: :favorite
но получите эту ошибку:
ArgumentError: Неверное имя маршрута, уже используется: 'favourite'
определили два маршрута с одинаковым именем, используя опцию :as
, или
Вы можете переопределить маршрут, уже определенный ресурсом с
то же имя. Для последнего вы можете ограничить маршруты, созданные с
resources
как объяснено здесь:
http://guides.rubyonrails.org/routing.html#restricting-the-routes-created
Как мне изменить это?
Как мне сохранить его согласованным, так как мне нужно создавать и уничтожать согласованные пути по моему мнению по ряду причин.
Мой контроллер
class FavoritesController < ApplicationController
before_action :load_listing, only: [:create, :destroy]
def index
@favorites = current_user.favorites.map{|i| i.id} || []
@listings = ListingsQuery::Search.call(:favorited_ids=> current_user.favorites.map{|i| i.id} )
respond_to do |format|
format.html {}
format.js {}
end
end
def create
if current_user.favorite!(@listing)
format.js {}
end
end
def destroy
if current_user.unfavorite!(@listing)
format.js {}
end
end
private
def load_listing
@listing_id = favorite_params[:listing_id]
@listing = Listing.find(@listing_id)
end
def favorite_params
params.permit(:listing_id)
end
end
вид
<% if listing.is_favorited == true %>
<%= link_to favorite_path(:listing_id => listing.listing_id), method: :delete, remote: true do%>
<i id='i-<%= listing.listing_id %>' class=" fa fa-heart"></i>
<% end %>
<% else %>
<%= link_to favorite_path(:listing_id => listing.listing_id), method: :post, remote: true do %>
<i id='i-<%= listing.listing_id %>' class="fa fa-heart-o"></i>
<% end %>
<% end %>
create.js
(function(){
$("#i-<%= @listing_id %>").removeClass('fa-heart-o');
$("#i-<%= @listing_id %>").addClass('fa-heart');
$("#i-<%= @listing_id %>").parent().attr("data-method",'delete');
})();
Почему это ...
resources :favorite do
collection do
post "for_lisiting/:listing_id", action: :create_for_listing
delete "for_listing/:listing_id", action: :delete_for_listing
end
end
предпочтительнее этого ..
match 'favorite' => 'favorites#create', via: :post
match 'favorite' => 'favorites#destroy', via: :delete
Мне кажется, но, возможно, я ошибаюсь. что
/favorite/for_lisiting/:listing_id(.:format)
неоправданно долго по сравнению с
/favorite/:listing_id(.:format)
Однако я новичок, поэтому цените ваши рассуждения.