Я хочу создать кнопку, которая только выполняет действие, но не перенаправляет на указанный путь - PullRequest
1 голос
/ 19 сентября 2019

Я новичок в ruby ​​на рельсах, но я хочу создать кнопку, которая переключается только из темного режима в светлый и наоборот.Я вижу, что необходимо указать путь, чтобы можно было распознать действие, но мне не нужен View.Есть ли способ вызвать только действие без пути?Я решил это, перенаправив пользователя на текущую страницу, на которой он на самом деле, но мне не нравится этот подход.У меня есть способ только назвать действие и ничего больше.Я думаю, что здесь маршрутизация не нужна, поскольку я хочу просто обновить переменную dark_mode в базе данных по нажатию кнопки dark_mode.

действие

    @user = User.find(current_user.id)
      @user.update_attribute :dark_mode, !@user.dark_mode
      redirect_back(fallback_location: root_path)
   end

представление кнопки

    <% if current_user.dark_mode == false %>
      <li><%= link_to t(:activate_dark_mode), dark_mode_switch_path %></li>
      <li class="divider"></li>
    <% else %>
      <li><%= link_to t(:deactivate_dark_mode), dark_mode_switch_path %></li>
      <li class="divider"></li>
    <% end %>

те маршруты

  get 'dark_mode'=> "users#dark_mode_switch", as:'dark_mode_switch'

Ответы [ 2 ]

3 голосов
/ 19 сентября 2019
  1. Добавьте remote: true к вашему link_to методу:

    <%= link_to t(:activate_dark_mode), dark_mode_switch_path, remote: true %>
    
  2. Добавьте head :ok к действию:

    def action
      @user = User.find(current_user.id)
      @user.update_attribute :dark_mode, !@user.dark_mode
      head :ok
    end
    
0 голосов
/ 19 сентября 2019

Действие при завершении приводит к перенаправлению, потому что вы запросили его, выполнив перенаправление после обновления записи пользователя redirect_back(fallback_location: root_path)

Вместо этого позвольте ссылке сделать запрос XHR на ваш сервер и в ответ либоотображать шаблон JS, который может уведомить пользователя ИЛИ ничего не делать (плохо !! пользователь должен знать, если что-то было успешно).

 def change_mode
   @user = User.find(current_user.id)
   @user.update_attribute :dark_mode, !@user.dark_mode
   respond_to do |format|
     format.js
   end
 end

В приложении / views / ** /change_mode.js.erb (любой шаблон представления может быть отображен, но по умолчанию будет что-то вроде выше.

alert("Mode Changed"); // You may append message in a div also. Alert is for demo.
...