Ruby on Rails 6 - 如何根据特定路线建模/隐藏视图?

Posted

技术标签:

【中文标题】Ruby on Rails 6 - 如何根据特定路线建模/隐藏视图?【英文标题】:Ruby on Rails 6 - how to model/hide views depending on specific route? 【发布时间】:2020-04-22 11:54:04 【问题描述】:

我想我不了解 Rails 中的路线。当用户在结帐页面时,我想隐藏导航栏和页脚。

到目前为止,我试图做这样的事情:

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

这是有效的。没有导航栏或页脚。

我的问题是当用户尝试提交表单并且验证不想接受时。

如果我理解正确:控制器尝试保存/创建 "post" 方法,但不能,所以它再次推动执行 :new ...现在我不明白了。

我们在 checkouts_path 但它实际上是 checkouts with method::post 而不是 :get 之一。这就是我们不呈现索引页面的原因。

为什么我们不再使用 new_checkout_path?因为我们的表格根本没有保存? 如果陈述如下,如何传递给我的穷人:

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

有没有办法做到这一点?我已阅读 Rails Routing from the Outside In 并尝试覆盖默认路由,但一无所获。有没有人耐心帮我理解一下?

谢谢。

【问题讨论】:

这能回答你的问题吗? Rails current_page? "fails" when method is POST 【参考方案1】:

newcreate 路由之间的区别是初学者常见的混淆来源,这完全取决于无能以及 REST 如何使用 HTTP 方法正确区分不同的操作。

# 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,因为那是表单提交的地方。您看到的是执行非幂等操作的结果。

如果您想检查您是否处于特定控制器的新操作或创建操作中,您想使用 controller_name 和 action_name:

<% if controller_name == "checkouts" && ["new", "create"].include?(action_name) %>
  # ...
<% end %>

【讨论】:

以上是关于Ruby on Rails 6 - 如何根据特定路线建模/隐藏视图?的主要内容,如果未能解决你的问题,请参考以下文章

如何计算 ruby​​ on rails 中的特定评分计数哈希?

如果 Ruby on Rails 中有设置限制,如何显示特定的 div 元素

使用 Ruby on Rails 4 和 Nginx 读写 cookie

Ruby on Rails 实时活动通知

Ruby on Rails 6.0.2.2 版如何使用jQuery hover() 方法

如何根据工作日Ruby on Rails显示数据