【问题标题】:How does yields know where to grab the correct html snippet?yield 如何知道在哪里获取正确的 html 片段?
【发布时间】:2017-12-02 13:19:00
【问题描述】:

我开始使用 ruby​​,但我几乎没有 Web 开发经验。我试图了解 ruby​​ 代码注入如何与 yield sn-ps 一起工作。我一直在破解谷歌的示例书代码

https://github.com/GoogleCloudPlatform/getting-started-ruby/blob/master/5-logging/app/views/layouts/application.html.erb

我目前在主视图/layout/目录下看这段代码sn-p

<div class="container">
  <% if flash.any? %>
    <% flash.each do |type, message| %>
      <div class="alert alert-<%= type %>"><%= message %></div>
    <% end %>
  <% end %>
  <%= yield %>
</div>

我一直在弄清楚如何产生指向 /view/books/index.html.erb 的链接

https://github.com/GoogleCloudPlatform/getting-started-ruby/blob/master/5-logging/app/views/books/index.html.erb

     <h3>Books</h3>

    <%= link_to new_book_path, class: "btn btn-success btn-sm" do %>
      <i class="glyphicon glyphicon-plus"></i>
      <span>Add Book</span>
    <% end %>

    <% @books.each do |book| %>
      <div class="book media">
        <%= link_to book_path(book) do %>
          <div class="media-left">
            <img src="<%= book.image_url %>">
          </div>
          <div class="media-body">
            <h4><%= book.title %></h4>
            <p><%= book.author %></p>
          </div>
        <% end %>
      </div>
    <% end %>

    <%= render "pagination_link" %>

    <% if @books.none? %>
      <p>No books found.</p>
    <% end %>

这是一个 rake 路由,所以你不必运行它

           rake routes
                 Prefix Verb   URI Pattern                            Controller#Action
                  books GET    /books(.:format)                       books#index
                        POST   /books(.:format)                       books#create
               new_book GET    /books/new(.:format)                   books#new
              edit_book GET    /books/:id/edit(.:format)              books#edit
                   book GET    /books/:id(.:format)                   books#show
                        PATCH  /books/:id(.:format)                   books#update
                        PUT    /books/:id(.:format)                   books#update
                        DELETE /books/:id(.:format)                   books#destroy
                       login GET    /login(.:format)                  redirect(301, /auth/google_oauth2) auth_google_oauth2_callback GET    /auth/google_oauth2/callback(.:format) sessions#create
               session POST   /session(.:format)                     sessions#create
                        DELETE /session(.:format)                     sessions#destroy
                user_books GET    /user_books(.:format)                  user_books#index
                 logout GET    /logout(.:format)                      sessions#destroy
                   root GET    /                                      books#index

【问题讨论】:

  • 你学习过Understanding yield吗?
  • 我已经尝试阅读该链接。我仍然很困惑。一切都显得那么含蓄。找到可搜索的关键字来理解代码真的很难
  • 这可能也有帮助:ActionView::Layouts

标签: ruby-on-rails ruby yield


【解决方案1】:

yield 是 Ruby 的block syntax 的一部分。

def hello
  "Hello, #{yield}!"
end

> hello { "World" }
# => "Hello, World!"

在本例中,hello 方法让步给我们传入的块以获取一个值,并将其添加到字符串中。

将模板视为一种特殊的文件,用于创建生成 html 的函数。布局和部分是相互嵌入模板的方式,就像您可以从另一个函数中调用一个函数一样。

你的模板是由Controller渲染的,所以它根据Rails conventions知道需要渲染什么视图,属于什么布局。

【讨论】:

【解决方案2】:

它不会尝试查找视图。它只是将控制权传递给控制器​​,以便控制器决定渲染哪个视图。

【讨论】:

  • 那么应用程序在哪里将控制权传递给控制器​​呢? ruby on rails 的问题是一切都如此隐含,以至于我什至无法阅读教程,因为该框架到处都在做黑魔法。提供的所有链接并不能真正解释上面缺少代码
  • @user1462442 Rails 路由器将 URL 与控制器/动作匹配并相应地进行调度。在那之后,这个 Rails 指南应该解释你需要的一切:guides.rubyonrails.org/… 所以整个过程有点像这样(简化):请求命中应用服务器 - Rails 路由器将请求 URL 与控制器动作匹配 - 动作执行其工作并呈现一个回应。由于 Rails 的“约定优于配置”方法,可以推断出视图等的确切位置。
  • @Michael Kohl 基于您的评论。由于 root 被指定为 book#index。当用户调用时,rails 映射调用 htts:://bookself.com/ -> book#index -> BookContoller -> render book.erb -> "yield" (application.erb)
  • @user1462442 基本上。我希望这有助于了解正在发生的事情。
猜你喜欢
  • 2017-10-09
  • 1970-01-01
  • 2020-09-20
  • 1970-01-01
  • 1970-01-01
  • 2012-07-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多