将搜索栏从着陆页转移到导航栏

时间:2017-11-07 11:54:28

标签: ruby-on-rails

我想要实现的是我希望将home.html.erb中的搜索栏放入我的_navbar.html.erb

不幸的是,复制粘贴不起作用(多么令人惊讶!),所以我尝试为我的导航栏创建一个控制器。问题是,我的_navbar.html.erb位于共享文件夹中并出现在每个页面上,而我的home.html.erb只是一个带有PagesController的单页。

我得到的错误是:

  

未定义的方法`model_name'为nil:NilClass

错误出现在home.html.erb的第二行

我的导航栏视图位于共享文件夹中,如下所示:

查看

  • 共享
    - > _footer.html.erb
    - > _navbar.html.erb

  • - > home.html.erb

这是home.html.erb中的搜索栏

<div class="search-bar">
  <%= simple_form_for [@books], url: books_path, method: :get do |f| %>
    <%= f.input :title, required: false, placeholder: "Title or Author", label: false %>
      <%= simple_fields_for :users do |r| %>
        <%= r.input :university, required: false, placeholder: "University", label: false %>
      <% end %>
    <%= f.button :submit, 'search', class: "btn" %>
  <% end %>
</div>

这是我的home.html.erb的PagesController

class PagesController < ApplicationController
  skip_before_action :authenticate_user!, only: :home
  def home
    @books = Book.new
  end
end

这是我尝试的共享文件夹的控制器

class SharedController < ApplicationController
  skip_before_action :authenticate_user!, only: :navbar
  def navbar
    @books = Book.new
  end
end

现在最重要的是我也遇到了困难, 路线

root to: 'pages#home'
get 'navbar' => 'shared#navbar'

我也尝试过使用_navbar而不仅仅是navbar。

2 个答案:

答案 0 :(得分:0)

如果您拥有_name的观看次数,则会将其用于render form.html.erb。所以路由和控制器找不到它,我想说。因此,请尝试使用渲染功能或处理您的视图及其名称。

同样simple_form_for @books应该更加严格?!或者你需要对你的@books进行数组:P

答案 1 :(得分:0)

首先,对于您收到的错误:简单表单尝试从您传递给@books方法(https://github.com/plataformatec/simple_form/blob/master/lib/simple_form/form_builder.rb)的记录对象(例如simple_form_for)中识别模型名称< / p>

由于您的路由和控制器没有正确连接,正如您所指出的那样,简单表单无法将@books追溯到模型。但是,我还有一些其他建议可以解决此错误并重构我认为您正在努力实现的目标:

我建议将搜索栏erb放在部分正弦中,让它在多个页面上可用。通过这种方式,您可以将其称为从视图而不是控制器调用它的位置(无论是否始终在导航中或其他位置)。

要记住部分内容的事情是,在调用它时需要传递部分中使用的任何变量。

例如:

render partial: 'shared/search_bar', books: @books

这意味着你所谓的部分来自于某个时候也应该有@books

@books可供所有视图开始使用(而不是传递给它)的任何简单方法是在ApplicationController类中定义它。

class ApplicationController < ActionController::Base
  helper_method :book_collection

  def book_collection
    @books = Book.all
  end
end

然后,您只需拨打render partial: 'shared/search_bar',然后在搜索表单中传入book_collection

与此类似,我认为您不需要为导航栏定义路线和控制器动作。我想一个导航栏是重复的代码,出现在所有页面上,这再次感觉像是局部的。顺便说一句,您已经使用下划线将文件命名为partials!

您可以在应用程序布局中调用导航栏部分以使其显示在每个页面上:

views/layouts/application.html.erb

<body>
  <%= render partial: 'shared/navbar' %>
# you could also call the search bar here, if books is available from application controller and you want it on every page, otherwise call it on the pages you want:
  <%= render partial: 'shared/search_bar' %>
</body>

所有这一切,我很好奇一旦用户提交搜索,您的搜索栏如何连接。我不确定您是否需要传递实例变量。我建议您查看本指南,在Rails应用程序中包含一个简单的搜索表单:http://www.rymcmahon.com/articles/2