Ruby на Rails 6 - как моделировать / скрывать представления в зависимости от заданного c маршрута? - PullRequest
1 голос
/ 22 апреля 2020

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

До сих пор я пытался сделать что-то вроде этого:

  <body>
  <% if current_page?(new_checkout_path)  %>
    <%= yield %>
  <% else %>
    <%= render 'layouts/navbar' %>
    <%= yield %>
    <%= render 'layouts/footer' %>
  <% end %>
  </body>

, и это работает , Там нет навигационной панели или нижнего колонтитула.

Моя проблема в том, что пользователь пытается отправить форму, и проверка не хочет принять это.

Если я правильно понимаю: контроллер пытается сохранить / создать, что является "post" методом, но не может, поэтому он должен сделать : new еще раз ... и теперь я не понимаю.

Мы находимся на checkouts_path , но на самом деле это проверок с методом:: post not : получите один. Вот почему мы не отображаем индексную страницу .

Почему мы снова не находимся на new_checkout_path ? Потому что наша форма не была сохранена вообще? Как перейти к моему бедному, если в отчете что-то вроде:

<% if current_page?(new_checkout_path) || current_page?(checkouts_path, method: :post %>

Есть ли способ сделать это таким образом? Я прочитал Rails Routing from Outside In и попытался переопределить маршруты по умолчанию, но ничего не закончилось. Есть ли кто-нибудь, кто поможет мне понять это?

Спасибо.

1 Ответ

0 голосов
/ 22 апреля 2020

Разница между маршрутами new и create является распространенным источником путаницы для начинающих, и все из-за бессилия и того, как REST использует методы HTTP, чтобы правильно различать guish между различными действиями.

# Given
rails g scaffold article title:string body:text

Это дает нам маршрут GET /articles/new, который просто отображает форму. Это идемпотентный маршрут, поскольку он покажет одинаковые результаты любому посетителю. Когда мы на самом деле публикуем форму, она отправляется как POST /articles, что является неидемпотентным действием, поскольку оно создает ресурс.

class ArticlesController < ApplicationController
  before_action :set_article, only: [:show, :edit, :update, :destroy]

  # ...

  # POST /articles
  def create
    @article = Article.new(article_params)

    if @article.save
      redirect_to @article, notice: 'Article was successfully created.'
    else
      render :new
    end
  end

  # ...

  private
    # Use callbacks to share common setup or constraints between actions.
    def set_article
      @article = Article.find(params[:id])
    end

    # Only allow a trusted parameter "white list" through.
    def article_params
      params.require(:article).permit(:title, :body)
    end
end

То, что вы и все остальные зациклились, это render :new. Эта строка не перенаправляет. Он просто отображает /app/views/articles/new.html.erb и отправляет его в ответе. Путь в браузере - /articles, поскольку именно туда отправляется форма. То, что вы видите, является результатом выполнения неидемпотентного действия.

Если вы хотите проверить, находитесь ли вы в новом или создать действие определенного c контроллера, вы хотите использовать вместо этого имя_ контроллера и имя_ действия:

<% if controller_name == "checkouts" && ["new", "create"].include?(action_name) %>
  # ...
<% end %>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...