Как мне перенаправить на root — public/index.html ?

#ruby-on-rails #path #redirect #root

#ruby-on-rails #путь #перенаправление #root

Вопрос:

Я хочу сделать перенаправление на index.html в моем приложении / общедоступной папке.

 def get_current_user
   @current_user = current_user
   if @current_user.nil?  
      redirect_to root_path
   end 
end
  

Как мне этого добиться?

Я не изменял root в моем routes.rb (он все еще прокомментирован)

  # root :to => "welcome#index"
  

Я получаю сообщение об ошибке, в котором говорится, что root_path не определен.

Как мне изменить routes.rb так, чтобы root_path указывал на public/index.html ?

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

1. Вместо использования root_path используйте redirect_to '/'

2. @meagar Это ответ, а не комментарий, так почему бы вам просто не создать свой ответ вместо комментария к вопросу?

3. @MBO Это не ответ. Вопрос был «Как мне сделать X?», а мой комментарий был «Не надо, вместо этого сделайте Y». Это неприемлемый ответ, IMO, и я бы проголосовал против других за публикацию его как такового.

Ответ №1:

Вы можете назначить именованный маршрут статическому файлу, передав любую непустую строку как :controller и путь к файлу в качестве :action для маршрута:

 Application.routes.draw do

  root :controller => 'static', :action => '/' 
  # or
  # root :controller => 'static', :action => '/public/index.html'

end

# elsewhere

redirect_to root_path # redirect to /
  

Предполагая, что у вас есть public/index.html , это то, что будет подано.

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

1. выполнение этого также означает, что обслуживаемое представление не имеет ничего общего с другими представлениями в приложении, что действительно маловероятно. Представления имеют общую компоновку, в этом прелесть сухости Rails.

2. @apneadiving Это подразумевает гораздо больше, чем просто отсутствие общего макета, но в этом нет ничего плохого. Если вы собираетесь обслуживать статический индексный файл, то, по-видимому, вы решили, что не существует общего макета, и нет абсолютно никаких причин не обслуживать index.html таким образом.

3. @meagar Полностью. На самом деле, IMO это выбор между общим макетом (MVC) и быстрым откликом (статические файлы). Rails поддерживает оба варианта, прелесть гибкости Rails. (В случае с MVC я все еще могу использовать CSS, чтобы сохранить несколько общий вид.)

Ответ №2:

на контроллере

  redirect_to root_path ## (will redirect to root '/')
  

Ответ №3:

файл маршрута:

      root 'main#index'
  

контроллер:

      class MainController < ApplicationController
       def index
         redirect_to '/index.html'
       end
     end
  

и при использовании rails 4 controller action live это может вести себя как одностраничное приложение, использующее M amp; C с изюминкой на V

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

1. На самом деле вам даже не нужно определять def index действие. Достаточно только определить контроллер и индексный файл. Rails пропустит действие в маршруте, если оно не найдено.

Ответ №4:

То, что вы хотите сделать, несовместимо с Rails.

Rails — это MVC, C для контроллера, V для представления.

Итак, его внутренним устройствам нужны оба.

Ok, public/index.html отображается по умолчанию, но это просто потому, что процесс обойден.

Итак, вы могли бы создать static контроллер с index действием и соответствующим ему представлением (просто скопируйте / вставьте в него содержимое вашего текущего public/index.html файла).

Затем установите:

 root :to => "static#index"
  

И, пожалуйста, удалите public/index.html файл 🙂

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

1. Rails поддерживает обслуживание статического содержимого из public каталога. Это полностью «совместимо с Rails».

2. @apneadiving Rails поставляется со статическим public/index.html из коробки для каждого нового проекта, и это работает довольно хорошо. Вы могли бы также сказать ему, что он должен коснуться базы данных, иначе он не использует ‘M’ в ‘MVC’.

3. Также «Rails — это MVC, C для контроллера, V для представления. Поэтому его внутренним устройствам нужны оба » полностью неверно. Каждый раз, когда вы выполняете a redirect_to , вы не используете «V» в MVC.

4. @meagar Я новичок в Rails (и MVC в целом), не могли бы вы подробнее объяснить, почему a redirect_to означает, что мы не используем ‘V’? Я этого не понимаю. Если для этого потребуется новый вопрос с длинным ответом, скажите мне, я его создам!

5. @Lucas При вызове из действия контроллера не задействовано представление redirect_to .

Ответ №5:

routes.rb

 ...
root to: redirect('public/index.html')
...
  

Это перенаправит весь запрос на '/' , на 'public/index.html' .