Rails Routing Clash при рендеринге статических страниц - PullRequest
3 голосов
/ 20 октября 2019

У меня есть конфликт маршрутизации. После перемещения всех сообщений в моем блоге с /posts/:id на /:id (что здорово) у меня появилась проблема, когда мои статические страницы не содержат идентификатора, поэтому они не отображаются. Я не хочу обрабатывать их через мой контроллер сообщений.

Вот что у меня в данный момент есть в моем файле rout.rb:

  resources :posts, only: [:index, :create, :edit, :new, :destroy]
  get '/:id' => 'posts#show', :as => 'custom_url'
  match '/posts/:id' => redirect('/%{id}', status: 301)

Но тогда они теперь не работают...

  match '/privacy' => 'static#privacy'
  match '/terms' => 'static#terms'

У меня есть контроллер с именем static_controller.rb, который я могу использовать в случае необходимости. Как я могу перепрыгнуть через /:id матч.

ОБНОВЛЕНИЕ:

Также возникают проблемы, когда мое обновление по умолчанию не обновляет мой контент.

  def update
    @post = Post.find(params[:id])

    respond_to do |format|
      if @post.update_attributes(params[:post])
        format.html { redirect_to @post, :notice => 'Post was successfully updated.' }
        format.json { head :no_content }
      else
        format.html { render :action => "edit" }
        format.json { render :json => @post.errors, :status => :unprocessable_entity }
      end
    end
  end

Ответы [ 2 ]

7 голосов
/ 20 октября 2019

Rails соответствует маршрутам сверху вниз, поэтому чем выше вершина, тем выше приоритет. См. Маршрутизация с внешней стороны . Если вы переместите эти маршруты

  match '/privacy' => 'static#privacy'
  match '/terms' => 'static#terms'

над этими маршрутами, статические маршруты будут иметь приоритет над сообщениями в блоге и должны отображаться правильно.

  resources :posts, only: [:index, :create, :edit, :new, :destroy]
  get '/:id' => 'posts#show', :as => 'custom_url'
  match '/posts/:id' => redirect('/%{id}', status: 301)

Обратите внимание, это означает, что если у вас естьлюбые идентификаторы постов в блогах, которые конфликтуют со статическими маршрутами страниц, статические страницы будут совпадать и отображаться.

0 голосов
/ 21 октября 2019

Чтобы избежать сценария, который вы описываете, вы НЕ должны совпадать и обходить /posts/ с перенаправлением. Это нарушает структуру иерархии и порядка и потенциально сделает ваш код более грязным, чем нужно. @Chris Selemers ответ правильный, но, как он указывает, при таком подходе существуют потенциальные (если очень ограниченные) риски.

get '/posts/:id' => 'posts#show', :as => 'custom_url'

Или, что еще лучше, просто сделайте:

resources :posts
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...