【问题标题】:How can I display the results of my search form in Rails?如何在 Rails 中显示搜索表单的结果?
【发布时间】:2015-06-25 16:08:10
【问题描述】:

我做了一个简单的搜索表单,基本上是在某些项目上搜索几个名字。如果可以在名称中找到搜索查询,我想在新页面上显示结果。我认为这真的很简单,只是对 Rails 不熟悉。

post_controler.rb -

class PostsController < ApplicationController
def index
    @posts = Post.all
  if params[:search]
    @posts = Post.search(params[:search]).order("created_at DESC")
  else
    @posts = Post.all.order('created_at DESC')
  end
end
end

routes.rb -

Rails.application.routes.draw do
  get '/index' => 'posts#index'
  resources :post, :posts
end

application.html.erb -

<!DOCTYPE html>
<html>
<head>
  <title>Trial</title>
  <%= stylesheet_link_tag    'application', media: 'all', 'data-turbolinks-track' => true %>
  <%= stylesheet_link_tag "defaults", media: "all", "data-turbolinks-track" => true %>
  <%= csrf_meta_tags %>
</head>
<body>

<%= yield %>

</body>
</html>

index.html.erb -

    <html>
        <body>
                <div class="input-group">
                    <%= form_tag(posts_path, :method => "get", id: "search-form") do %>
                    <%= text_field_tag :search, params[:search], placeholder: "Search Posts", class: 'form-control' %>
                <span class="input-group-btn">
                     <%= submit_tag "Search", class: 'btn btn-success' %>
                </span>
                <% end %>
                </div>
                </form>

</body>
</html>

post.rb

class Post < ActiveRecord::Base
def self.search(search)
  where("name LIKE ?", "%#{search}%") 
end

end

【问题讨论】:

  • 迭代@posts。如果您不需要它们,请不要选择所有它们,否则您将去 DB 两次。不过,在进一步深入之前,可能需要一个教程。
  • 有点困惑除了
  • 这有什么问题? (但你不需要&lt;%= ...,你只需要&lt;% ...,否则你会得到each返回值的字符串表示,几乎肯定不是你想要的。)
  • 如果我希望它创建一个新页面来显示结果,我是否只需将它放在索引文件中?
  • 如果您希望它出现在资源的索引页面上,可以。 (这不是“新页面”,而是您正在修改的现有页面。)

标签: ruby-on-rails ruby search


【解决方案1】:

您可以将此代码放入您的 index.html.erb 文件中。是否有搜索参数都没有关系。只需将以下代码放在表单下方即可。

<% @posts.each do |post| %>
  <p>
    <%= post.name %>
  </p> 
<% end %>

您的控制器代码没问题。但是执行以下操作将使其高效。它将访问数据库一次。

def index
  @posts = Post.all.order('created_at DESC')
  @posts = @posts.search(params[:search]) if params[:search].present?
end

已更新以重定向到新页面

post_controller.rb

def search
  @posts = Post.all.order('created_at DESC')
  @posts = @posts.search(params[:search]) if params[:search].present?
end

routes.rb

resources :posts do
  member do
    post :search
  end
end

search.html.erb

<% @posts.each do |post| %>
  <p>
    <%= post.name %>
  </p> 
<% end %>

希望对您有所帮助。并在 index.html.erb 的 form_tag 中更改搜索路径。

【讨论】:

  • 如何才能让结果显示在新页面中?
  • 这很简单。只需将表单的 url 放入一个新的操作中,例如搜索。在成员的路线中提及它。并有一个用于搜索操作的新页面。
  • 对不起,我对 MVC 还是有点困惑。那么我该如何处理呢?是否在我的帖子控制器中定义一个新操作,并创建一个访问该操作的路由?我该如何做才能从那里打开结果的新页面?
  • 你从哪里获得“会员”的路线?
  • 您不限于RESTful 路由默认创建的7 个路由。如果您愿意,您可以添加适用于“集合”或集合的单个“成员”的其他路线。您可以从guides.rubyonrails.org/routing.html#adding-more-restful-actions获取详细信息
猜你喜欢
  • 2021-12-10
  • 2017-10-11
  • 1970-01-01
  • 2010-11-24
  • 1970-01-01
  • 2016-04-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多