Основной поиск рельсов не рендеринг результатов - PullRequest
0 голосов
/ 29 января 2019

Рельсы новичка здесь.Я пытаюсь реализовать базовую функцию поиска в своем приложении, и мне не повезло, что результаты поиска отображаются в моем фрагменте.Я смотрел онлайн на руководства по рельсам, просматривал форумы здесь, экспериментировал с различными уроками с небольшим успехом.

Как я уже упоминал, Rails новичок здесь, так что я уверен, что мой код, вероятно, довольно уродлив.Будем весьма благодарны за любые подсказки о том, как соблюдать надлежащий этикет.:)

Контроллер сообщений

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

rout.rb

 Rails.application.routes.draw do
 devise_for :admin_users, ActiveAdmin::Devise.config
 ActiveAdmin.routes(self)

 resources :posts

 root to: 'posts#index', as: :home

Модель сообщений

 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 %>

Gemfile

gem 'activeadmin'
gem 'kaminari'
gem 'friendly_id'

Я считаю, что это весь соответствующий код.Пожалуйста, дайте мне знать, если вам нужно что-нибудь дополнительное.

Как вы видите, я добавляю сообщения через activeadmin, поэтому я не уверен, что это как-то повлияет на это.Все работает нормально, и я получаю галочку в URL, которая, как мне кажется, говорит о том, что он нашел совпадение, но я пытаюсь заставить его перейти к частичному показу в представлении сообщений, но ничего не происходит.

РедактироватьСпасибо за все ваши ответы.Я попробовал каждый, но безуспешно.Однако я считаю, что проблема не в том, чтобы просто изучить все тонкости драгоценного камня.Мне нужно взять несколько онлайн-классов, чтобы узнать больше об основах.Я оставлю этот пост открытым и добавлю рабочее решение, чтобы помочь другим, как только у меня получится лучше разобраться в основах.Еще раз спасибо всем!:)

Edit_2: Ответ опубликован ниже.

Ответы [ 3 ]

0 голосов
/ 30 января 2019

может помочь вам 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

модели / проекта.руб

def self.search(search)
  if search
    find(:all, :conditions => ['name LIKE ?', "%#{search}%"])
  else
    find(:all)
  end
end
0 голосов
/ 13 февраля 2019

Ладно, ребята, после долгих ударов и исследований я сумел придумать уродливое решение, но это хорошая отправная точка для тех, кто борется с этой же проблемой.

Post Controller

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

rout.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.Удачного кодирования!

0 голосов
/ 30 января 2019

Проблема в том, что вы не передаете правильные параметры для поиска.Вы можете попробовать следующим образом:

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 Controller

def index
  @posts = Post.all
  @search = @posts.ransack(params[:q])
  @posts = @search.result.order(:created_at)
end

Вы также можете проверить более подробную информацию оварианты поиска здесь Ransack gem

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...