Мои маршруты CREATE & DELETE не работают, не понимаю почему?

Здравствуйте, я пытаюсь создать функцию закладок в своем приложении. Я создал модель, которую хочу добавить в закладки (прическа), у меня также есть модель пользователя и модель «Saved_Hairstyle», которая является таблицей соединений в сценарии. В моем файле route.rb я добавил маршрут CREATE & DELETE. В моем контроллере я прописал методы CREATE и DELETE. Затем я перешел к link_to моим путям методов CREATE & DELETE в моем представлении.

Я хотел бы, чтобы, когда я нажимаю ссылку CREATE Link, запускается метод POST, чтобы я мог показать элемент на странице как «закладку», а когда я нажимаю ссылку DELETE, запускается метод DELETE, чтобы я мог показать элемент на странице как «незаложенные в закладки», но они не работают. Когда я делаю RAILS ROUTES в Rails C, я вижу правильные пути, но когда я щелкаю по ссылкам, ничего не делаю. Репозиторий для простоты понимания: https://github.com/Angela-Inniss/hair-do< /а>

маршруты.rb

Rails.application.routes.draw do
  root to: 'pages#home'
  devise_for :users
  resources :hairstyles do
    member do
      put "like", to: "hairstyles#upvote"
      put "dislike", to: "hairstyles#downvote"
    end
    resources :comments, only: :create
    resources :saved_hairstyles, only: [:new,:create]
  end
  resources :saved_hairstyles, only: :destroy
  resources :comments, only: :destroy
  resources :hairdressers
end

class SavedHairstylesController < ApplicationController
  def create    
    @hairstyle = Hairstyle.find(params[:hairstyle_id])  
    @saved_hairstyle = SavedHairstyle.new(user: current_user, hairstyle: @hairstyle)   
    if @saved_hairstyle.save
      respond_to do |format|       
        format.html { redirect_to hairstyle_path(@saved_hairstyle.hairstyle) }
        format.js  # <-- will render `app/views/comments/create.js.erb`
      end
    else
      respond_to do |format|
        format.html { render 'hairstyles' }
        format.js  # <-- idem
      end
    end
  end
end

  def destroy    
    @saved_hairstyle = SavedHairstyle.find(params[:id])
    @saved_hairstyle.destroy
    @hairstyle = @saved_hairstyle.hairstyle
    respond_to do |format|
      format.html { redirect_to hairstyle_path(@saved_hairstyle.hairstyle }
      format.js
    end
  end

view.html.erb

   <div class="bookmark">

              <% saved_hairstyle = SavedHairstyle.find_by(user: current_user, hairstyle: hairstyle.id) %>

              <% if saved_hairstyle %>
                <%= link_to  hairstyle_saved_hairstyle_path(saved_hairstyle), method: :post do %>
                    <i class="fas fa-plus"></i>
                 <% end %>

              <% else %>
                <%= link_to saved_hairstyle_path(hairstyle), method: :delete do %>
                    <i class="fas fa-plus-circle"></i>
                <% end %>
              <% end %>
            </div>

файл create.js.erb (это то, что я хотел бы получить в запросе POST (у меня есть что-то подобное для запроса DELETE)


plusCircle = document.getElementById("bookmark");
plusCircle.innerHTML = `<%= link_to  '#', method: :post do %>
                    <i class="fas fa-plus"></i>
                 <% end %>`


person Angela Inniss    schedule 01.05.2019    source источник


Ответы (1)


Кажется, в вашей логике просмотра есть некоторые ошибки. Вы загружаете сохраненные прически и пытаетесь снова добавить их в закладки. Вы также пытаетесь удалить сохраненную прическу, если она не существует. Помощники пути также кажутся неправильными (метод удаления не является вложенным, а вложенные ресурсы должны быть множественными). Возможно, это должно выглядеть примерно так:

   <div class="bookmark">
      <% saved_hairstyle = SavedHairstyle.find_by(user: current_user, hairstyle: hairstyle.id) %>
      <% if saved_hairstyle %>
        <%= link_to saved_hairstyle_path(saved_hairstyle), method: :delete do %>
           <i class="fas fa-plus-circle"></i>
         <% end %>
       <% else %>
          <%= link_to  hairstyle_saved_hairstyles_path(hairstyle), method: :post do %>
            <i class="fas fa-plus"></i>
          <% end %>
        <% end %>
    </div>

Кстати, если вы проверите свою консоль, вы, вероятно, увидите некоторые ошибки, которые укажут вам правильное направление. Вы также должны переместить запрос save_hairstyle во вспомогательный метод.

person EJAg    schedule 01.05.2019
comment
Привет @ EJ2015 Теперь, когда я смотрю на ваш ответ, я понимаю, что я делал неправильно, поскольку я все еще учусь, мне пришлось пройти его построчно и написать, что делала каждая строка (чтобы дать вам представление о моем уровне). Из вашего комментария единственный бит, в котором я сейчас не уверен, - это последняя часть, где вы говорите, что вам также следует переместить запрос save_hairstyle во вспомогательный метод. Что вы имеете в виду и почему? Заранее спасибо. p.s. Я реализовал ваш код, и, кажется, он работает, просто Pundit Gem блокирует выполняемое действие, поэтому мне нужно разобраться с этим сейчас. - person Angela Inniss; 02.05.2019
comment
Отлично. Мое последнее наблюдение — просто напоминание о том, что как только вы запустите все, не забудьте провести рефакторинг. app/helpers обычно это место, где вы можете припарковать своих маленьких помощников для очистки ваших шаблонов. - person EJAg; 02.05.2019
comment
Ar OK понял, я этого не знал, но это имеет смысл. Еще раз спасибо за вашу помощь. :) - person Angela Inniss; 02.05.2019