基本 rails 搜索未呈现结果
Basic rails search not rendering results
Rails 这里是新手。我正在尝试在我的应用程序中实现一个基本的搜索功能,但我没有运气让搜索结果在我的部分中呈现。我在网上查看了 rails 指南,搜索了这里的论坛,尝试了各种教程,但收效甚微。
正如我提到的,Rails 新手在这里,所以我确定我的代码可能非常难看。任何有关如何遵守适当礼仪的提示将不胜感激。 :)
Post 控制器
def index
@posts = Post.ransack(params[:query], load:true).result
end
def show
@post = Post.friendly.find(params[:id])
end
def post_params
params.require(:post).permit(:title, :body, :image, :slug)
end
def search_params
params.permit(:search_title, :search_body)
end
routes.rb
Rails.application.routes.draw do
devise_for :admin_users, ActiveAdmin::Devise.config
ActiveAdmin.routes(self)
resources :posts
root to: 'posts#index', as: :home
Post 型号
belongs_to :category
extend FriendlyId
friendly_id :title, :use => [:slugged, :finders]
validates :title, presence: true, length: { minimum: 5 }
validates :body, presence: true
validates :image, presence: true
def self.search_posts(search)
if search
where(["title LIKE ?","%#{search}%"])
else
all
end
end
end
app/views/posts/index.html.erb
<%= form_tag posts_path, :method => 'get' do %>
<%= text_field_tag :search, params[:search], placeholder: "Search Posts" %>
<%= submit_tag "Search" %>
<% if @posts.present? %>
<%= render 'posts/show' %>
<% else %>
<p>We cannot find posts containing the term(s) <%= params[:search] %>. Please try again.</p>
<% end %>
宝石文件
gem 'activeadmin'
gem 'kaminari'
gem 'friendly_id'
我相信这就是所有相关代码。如果您需要任何额外的东西,请告诉我。
如您所见,我通过 activeadmin 添加了 Posts,所以我不确定这是否对此有任何影响。一切正常,我在 url 中得到复选标记,我相信它告诉我它找到了匹配项,但我试图让它在 posts 视图中显示部分但没有发生了。
编辑:感谢您的所有回复。我尝试了每一个但没有成功。然而,我相信这个问题比简单地了解 gem 的来龙去脉更重要。我需要上网学习 类 来加强基础知识。一旦我更好地掌握了基础知识,我将让这个 post 保持打开状态并添加一个可行的解决方案来帮助其他人。再次感谢大家! :)
Edit_2:答案在下面post编辑。
问题是您没有为搜查搜索传递正确的参数。您可以尝试如下:
app/views/posts/index.html.erb
<%= search_form_for @search, url: posts_path do |f| %>
<div class="row">
<div class="col-12 col-md-4 col-xl-5">
<%= f.label :posts_name_cont, 'Search by Product Name' %>
<%= f.search_field :posts_name_cont, class: 'form-control' %>
</div>
<div class="col-12 col-md-3 col-xl-3 pt-4 pr-md-5 pb-2">
<button class="btn btn-success btn-large mx-auto col-12 mb-2 mt-2 float-right" type="submit" name="action">Search</button>
</div>
</div>
<% end %>
<% if @posts.any? %>
<% @posts.each do |p| %>
<%= p.title %>
<% end %>
<% end %>
Post 控制器
def index
@posts = Post.all
@search = @posts.ransack(params[:q])
@posts = @search.result.order(:created_at)
end
您还可以在此处查看有关搜索选项的更多详细信息Ransack gem
可能对你有帮助railcast
projects/index.rhtml
<% form_tag projects_path, :method => 'get' do %>
<p>
<%= text_field_tag :search, params[:search] %>
<%= submit_tag "Search", :name => nil %>
</p>
<% end %>
projects_controller.rb
def index
@projects = Project.search(params[:search])
end
models/project.rb
def self.search(search)
if search
find(:all, :conditions => ['name LIKE ?', "%#{search}%"])
else
find(:all)
end
end
好吧伙计们,经过大量的头脑风暴和研究,我设法想出了一个丑陋的解决方案,但对于任何在同一问题上苦苦挣扎的人来说,这是一个很好的起点。
Post 控制器
def search
if params[:post].present?
@post = Post.search(params[:post])
if @post #meaning if it's not nil or nothing matches the search
render 'posts/results'
end
else
flash[:danger] = "You have entered an empty search"
redirect_to 'Home'
end
end
routes.rb
resources :posts
root to: 'posts#index', as: :home
get 'search_posts', to: 'posts#search'
models/post.rb
validates :title, presence: true, length: { minimum: 3, maximum: 50 }
validates :body, presence: true, length: { minimum: 10, maximum: 300 }
def self.search(search)
where("lower(title) like ? OR lower(body) like ?", "%#{search.downcase}%", "%#{search.downcase}%")
end
查看
<h3>Search for Posts</h3>
<div id="post-lookup">
<%= form_tag search_posts_path, method: :get, id: "post-lookup-form" do %>
<div class="form-group row no-padding text-center col-md-12">
<div class="col-md-10">
<%= text_field_tag :post, params[:post], placeholder: "Post Lookup", autofocus: true, class: "form-control search-box input-lg" %>
</div>
<div class="col-md-2">
<%= button_tag(type: :submit, class: "btn btn-lg btn-success") do %>
Look up a post
<% end %>
</div>
</div>
<% end %>
</div>
<% if @post %>
<% @post.each do |post| %>
<div class="well results-block">
<strong>Title:</strong><%= post.title %>
<strong>Body:</strong><%= post.body %>
</div>
<% end %>
<% end %>
正如我所说,丑陋。但它至少是功能性的。我希望这可以帮助那里的人。现在我要清理这个光荣的烂摊子并添加一些 AJAX。编码愉快!
Rails 这里是新手。我正在尝试在我的应用程序中实现一个基本的搜索功能,但我没有运气让搜索结果在我的部分中呈现。我在网上查看了 rails 指南,搜索了这里的论坛,尝试了各种教程,但收效甚微。
正如我提到的,Rails 新手在这里,所以我确定我的代码可能非常难看。任何有关如何遵守适当礼仪的提示将不胜感激。 :)
Post 控制器
def index
@posts = Post.ransack(params[:query], load:true).result
end
def show
@post = Post.friendly.find(params[:id])
end
def post_params
params.require(:post).permit(:title, :body, :image, :slug)
end
def search_params
params.permit(:search_title, :search_body)
end
routes.rb
Rails.application.routes.draw do
devise_for :admin_users, ActiveAdmin::Devise.config
ActiveAdmin.routes(self)
resources :posts
root to: 'posts#index', as: :home
Post 型号
belongs_to :category
extend FriendlyId
friendly_id :title, :use => [:slugged, :finders]
validates :title, presence: true, length: { minimum: 5 }
validates :body, presence: true
validates :image, presence: true
def self.search_posts(search)
if search
where(["title LIKE ?","%#{search}%"])
else
all
end
end
end
app/views/posts/index.html.erb
<%= form_tag posts_path, :method => 'get' do %>
<%= text_field_tag :search, params[:search], placeholder: "Search Posts" %>
<%= submit_tag "Search" %>
<% if @posts.present? %>
<%= render 'posts/show' %>
<% else %>
<p>We cannot find posts containing the term(s) <%= params[:search] %>. Please try again.</p>
<% end %>
宝石文件
gem 'activeadmin'
gem 'kaminari'
gem 'friendly_id'
我相信这就是所有相关代码。如果您需要任何额外的东西,请告诉我。
如您所见,我通过 activeadmin 添加了 Posts,所以我不确定这是否对此有任何影响。一切正常,我在 url 中得到复选标记,我相信它告诉我它找到了匹配项,但我试图让它在 posts 视图中显示部分但没有发生了。
编辑:感谢您的所有回复。我尝试了每一个但没有成功。然而,我相信这个问题比简单地了解 gem 的来龙去脉更重要。我需要上网学习 类 来加强基础知识。一旦我更好地掌握了基础知识,我将让这个 post 保持打开状态并添加一个可行的解决方案来帮助其他人。再次感谢大家! :)
Edit_2:答案在下面post编辑。
问题是您没有为搜查搜索传递正确的参数。您可以尝试如下:
app/views/posts/index.html.erb
<%= search_form_for @search, url: posts_path do |f| %>
<div class="row">
<div class="col-12 col-md-4 col-xl-5">
<%= f.label :posts_name_cont, 'Search by Product Name' %>
<%= f.search_field :posts_name_cont, class: 'form-control' %>
</div>
<div class="col-12 col-md-3 col-xl-3 pt-4 pr-md-5 pb-2">
<button class="btn btn-success btn-large mx-auto col-12 mb-2 mt-2 float-right" type="submit" name="action">Search</button>
</div>
</div>
<% end %>
<% if @posts.any? %>
<% @posts.each do |p| %>
<%= p.title %>
<% end %>
<% end %>
Post 控制器
def index
@posts = Post.all
@search = @posts.ransack(params[:q])
@posts = @search.result.order(:created_at)
end
您还可以在此处查看有关搜索选项的更多详细信息Ransack gem
可能对你有帮助railcast
projects/index.rhtml
<% form_tag projects_path, :method => 'get' do %>
<p>
<%= text_field_tag :search, params[:search] %>
<%= submit_tag "Search", :name => nil %>
</p>
<% end %>
projects_controller.rb
def index
@projects = Project.search(params[:search])
end
models/project.rb
def self.search(search)
if search
find(:all, :conditions => ['name LIKE ?', "%#{search}%"])
else
find(:all)
end
end
好吧伙计们,经过大量的头脑风暴和研究,我设法想出了一个丑陋的解决方案,但对于任何在同一问题上苦苦挣扎的人来说,这是一个很好的起点。
Post 控制器
def search
if params[:post].present?
@post = Post.search(params[:post])
if @post #meaning if it's not nil or nothing matches the search
render 'posts/results'
end
else
flash[:danger] = "You have entered an empty search"
redirect_to 'Home'
end
end
routes.rb
resources :posts
root to: 'posts#index', as: :home
get 'search_posts', to: 'posts#search'
models/post.rb
validates :title, presence: true, length: { minimum: 3, maximum: 50 }
validates :body, presence: true, length: { minimum: 10, maximum: 300 }
def self.search(search)
where("lower(title) like ? OR lower(body) like ?", "%#{search.downcase}%", "%#{search.downcase}%")
end
查看
<h3>Search for Posts</h3>
<div id="post-lookup">
<%= form_tag search_posts_path, method: :get, id: "post-lookup-form" do %>
<div class="form-group row no-padding text-center col-md-12">
<div class="col-md-10">
<%= text_field_tag :post, params[:post], placeholder: "Post Lookup", autofocus: true, class: "form-control search-box input-lg" %>
</div>
<div class="col-md-2">
<%= button_tag(type: :submit, class: "btn btn-lg btn-success") do %>
Look up a post
<% end %>
</div>
</div>
<% end %>
</div>
<% if @post %>
<% @post.each do |post| %>
<div class="well results-block">
<strong>Title:</strong><%= post.title %>
<strong>Body:</strong><%= post.body %>
</div>
<% end %>
<% end %>
正如我所说,丑陋。但它至少是功能性的。我希望这可以帮助那里的人。现在我要清理这个光荣的烂摊子并添加一些 AJAX。编码愉快!