Исправить несоответствующие названия маршрутов (Rails) - PullRequest
0 голосов
/ 10 апреля 2019

Маршруты

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) 

Однако я новичок, поэтому цените ваши рассуждения.

1 Ответ

0 голосов
/ 10 апреля 2019

При использовании rails resource helper он создает некоторые конечные точки REST. У вас есть списки, которые можно добавить в избранное, вы смешиваете оба ресурса. Ваш ресурс - листинг, а избранное / не избранное / избранное - действия на ресурсе.

Попробуйте что-то вроде этого:

resources :listings do
  member do
    post :favorite, action: :create_favorite
    delete :favorite, action: :delete_favorite
    get :favorites
  end
end

Это даст вам два маршрута: /listings/:id/favorite (оба для создания -POST- и удаления -DELETE-) и /listings/:id/favorites (GET). И создание, и удаление будут одинаковыми favorite_listing_path(listing) (или аналогичными, отметьте rake routes).

Теперь, в вашем ListController, определите эти действия:

class ListingsController < ApplicationController
  def create_favorite
    Listing.find(:id).favorites.create(user: current_user)
    redirect_to :something, notice: 'Favorited'
  end

  def delete_favorite
    Listing.find(id).favorites.where(user: current_user).destroy_all
    redirect_to :something, notice: 'Unfavorited'
  end

  def favorites
    @favorites = Listing.find(id).favorites
  end

  # of course, you could add a before_action to DRY it, I just wanted to be explicit on which is the actual resource
end
...