Возникли проблемы с использованием unless current_page? чтобы скрыть кнопку

#ruby-on-rails #ruby-on-rails-3 #ruby-on-rails-5

#ruby-on-rails #ruby-on-rails-3 #ruby-on-rails-5

Вопрос:

Я пытаюсь скрыть эту кнопку со всех страниц показа Rooms модели. У меня есть массив комнат id , хранящихся в @extra , но всякий раз, когда я пытаюсь использовать current_page?(room_path(@extra)) его, он не работает, но, например, когда я указываю идентификатор, current_page?(room_path(6)) он работает и скрывает кнопку. Что я делаю не так?

 <% unless current_page?(controller: 'rooms') || current_page?(room_path(@extra))%>

   <button onclick="myFunction()" class="button btn btn-light bg-white rounded-pill shadow-sm px-4 mb-4" 
   style="vertical-align:middle">
   <span>
      <small class="text-uppercase font-weight-bold"> Nav-bar Toggle</small>
   </span>
</button>

      <% end %>
  

маршруты / rb

 require 'sidekiq/web'

Rails.application.routes.draw do
  resources :messages
  resources :rooms
  # Routing for budget section
  resources :budgets do
    resources :groups do
      resources :categories
    end
  end

  resources :posts do 
    resources :likes
    resources :comments
  end
  
  resources :socials
  resources :mentions, only: [:index]
  resources :mentioned_posts, only: [:index]
  resources :follows
  resources :followers, only: [:index]
  resources :followings, only: [:index]


  resources :accounts
  resources :goals
  resources :retirements
  get '/users', to: 'users#index'
  get '/user/:id', to: 'users#show', as: 'user'
  resources :calculate_debts
  
  get '/privacy', to: 'home#privacy'
  get '/terms', to: 'home#terms'
    authenticate :user, lambda { |u| u.admin? } do
      mount Sidekiq::Web => '/sidekiq'
    end


  resources :notifications, only: [:index]
  resources :announcements, only: [:index]
  devise_for :users, controllers: { omniauth_callbacks: "users/omniauth_callbacks" }
  root to: 'home#index'
  # For details on the DSL available within this file, see https://guides.rubyonrails.org/routing.html
end
  

Комментарии:

1. Я полагаю room_path , что ожидается целое число, а не массив. Почему вы передаете массив этому?

2. При попытке запустить его обычным способом <% unless current_page?(controller: 'rooms', action: 'show') %> я получаю эту ошибку No route matches {:action=>"show", :controller=>"rooms"}

3. Я получаю эту ошибку только тогда, когда покидаю страницу rooms индекса или страницу показа, и именно поэтому я подумал о сохранении значений в массиве, поскольку другой метод не сработал

4. Возможно ли предоставить общий доступ к вашему routes.rb файлу?

5. Я только что добавил его

Ответ №1:

На основе информации, представленной в комментариях. show Для завершения пути требуется идентификатор. Вы можете проверить это с помощью,

 current_page?(controller: 'rooms', action: 'show', id: room_id)
  

вместо

 current_page?(controller: 'rooms', action: 'show')
  

Если вы хотите проверить конкретный идентификатор комнаты, вы можете использовать

 current_page?(controller: 'rooms', action: 'show', id: room_id)
  

Если вы хотите проверить только контроллер и действие, независимо от идентификатора комнаты, вам придется использовать другую стратегию. Вы можете использовать,

 if params[:controller] == :rooms amp;amp; params[:action] == :show
  

или сопоставление с регулярным выражением

 if request.fullpath =~ //rooms/d /
  

Комментарии:

1. Я получаю эту ошибку, когда пытаюсь запустить, undefined local variable or method `room_id' for #<#<Class:0x00007f70418f3938>:0x00007f70418f1480> Did you mean? dom_id что id: room_id , как предполагается, делать?

2. room_id это был просто пример, который я привел. Вам нужно заменить это на идентификатор комнаты, которую вы ищете.