2016-03-14 5 views
-2

Я пытаюсь выполнить поиск базы данных в приложении, однако мне не удалось заставить поиск работать правильно.DB Query in Ruby on Rails

На индексной странице у меня есть возможность поиска или отображения всех элементов в базе данных, однако return all всегда кажется вызванным, а не поиском. Если кто-то ищет, я хотел бы только отобразить искомый элемент, когда поиск будет завершен.

Я, однако, сталкиваюсь с некоторыми проблемами.

articles_controller.rb:

class ArticlesController < ApplicationController 
    def index 
    if params[:id] 
     fun = Article.find_by(title: params[:id].search) 
    else 
     @articles = Article.all 
    end 
    end 

    def show 
    @article = Article.find(params[:search]) 
    end 

    def new 
    @article = Article.new 
    end 

    def edit 
    @article = Article.find(params[:id]) 
    end 

    def create 
    @article = Article.new(params.require(:article).permit(:title, :text)) 

    if @article.save 
     redirect_to @article 
    else 
     render 'new' 
    end 
    end 

    def update 
    @article = Article.find(params[:id]) 

    if @article.update(article_params) 
     redirect_to @article 
    else 
     render 'edit' 
    end 
    end 

    def destroy 
    @article = Article.find(params[:id]) 
    @article.destroy 

    redirect_to articles_path 
    end 

    private 
    def article_params 
     params.require(:article).permit(:title, :text) 
    end 
end 

article.rb:

class Article < ActiveRecord::Base 

    validates :title, presence: true, 
        length: { minimum: 5 } 

    def self.search(search) 
     if :search 
     Article.where('tite LIKE ?', "%#{search}%") 
     else 
     Article.all 
     end 
    end 

end 

index.html.erb:

<h1>Listing articles</h1> 

<%= link_to 'New article', new_article_path %> 

<table> 
    <tr> 
    <th>Title</th> 
    <th>Text</th> 
    <th colspan="3"></th> 
    </tr> 

    <% @articles.each do |article| %> 
    <tr> 
     <td><%= article.title %></td> 
     <td><%= article.text %></td> 
     <td><%= link_to 'Show', article_path(article) %></td> 
     <td><%= link_to 'Edit', edit_article_path(article) %></td> 
     <td><%= link_to 'Destroy', article_path(article), 
       method: :delete, 
       data: { confirm: 'Are you sure?' } %></td> 
    </tr> 
    <% end %> 


    <%= form_tag articles_path, :method => 'get' do %> 
    <p> 
     <%= text_field_tag :search, params[:search] %> 
     <%= submit_tag "Search", :title => nil %> 
    </p> 
<% end %> 

</table> 

Backend БД:

Started GET "/articles?search=asdfa&commit=Search&utf8=%E2%9C%93" for ::1 at 2016-03-14 15:01:12 -0400 
Processing by ArticlesController#index as HTML 
    Parameters: {"search"=>"asdfa", "commit"=>"Search", "utf8"=>"✓"} 
    Article Load (0.1ms) SELECT "articles".* FROM "articles" 
    Rendered articles/index.html.erb within layouts/application (1.4ms) 
Completed 200 OK in 19ms (Views: 18.6ms | ActiveRecord: 0.1ms) 

последняя ошибка/некорректный вызов:

Started GET "/assets/application.self-3b8dabdc891efe46b9a144b400ad69e37d7e5876bdc39dee783419a69d7ca819.js?body=1" for ::1 at 2016-03-14 15:39:25 -0400 


Started GET "/articles?search=asdfa&commit=Search&utf8=%E2%9C%93" for ::1 at 2016-03-14 15:39:40 -0400 
Processing by ArticlesController#index as HTML 
    Parameters: {"search"=>"asdfa", "commit"=>"Search", "utf8"=>"✓"} 
    Article Load (0.1ms) SELECT "articles".* FROM "articles" 
    Rendered articles/index.html.erb within layouts/application (1.3ms) 
Completed 200 OK in 18ms (Views: 17.2ms | ActiveRecord: 0.1ms) 

Что именно я делаю не так? Как я могу исправить/сделать эту работу?

+0

Задавая это помогает придумать более окончательное название, а не что-то общее и невзрачный , Название - это то, что привлекает внимание тех, кому вы хотите помочь, так что точность хорошая. –

ответ

3

Вы определили search метод в вашей модели, но вы не используете его в контроллере:

def index 
    @articles = Article.search params[:search] 
end 

В модели, у вас есть какие-то логические ошибки (символ :search вместо search переменной, Тит вместо title):

def self.search search 
    search.present? ? where('title LIKE ?', "%#{search}%") : all 
end 
+0

по-прежнему получают следующие «Начал GET»/articles? Search = asdfa & commit = Search & utf8 =% E2% 9C% 93 "for :: 1 at 2016-03-14 15:30:01 -0400 Обработка по статьямСправочник № индекса как HTML Параметры: {"search" => "asdfa", "commit" => "Поиск", "utf8" => "✓"} Article Load (0.1ms) SELECT "articles". * FROM "articles" Представленные статьи/index.html.erb в макетах/приложении (1.1ms) Завершено 200 OK в 18ms (Просмотров: 17.1ms | ActiveRecord: 0.1ms) ' –

+0

мы ввели новую ошибку, к сожалению, я опубликую в основном корпусе для сохранения форматирования. –

0

в контроллере у вас есть:

def index 
    if params[:id] 
     fun = Article.find_by(title: params[:id].search) 
    else 
     @articles = Article.all 
    end 
end 

, но вы определенно не передаете какой-либо идентификатор контроллеру через форму.

Например, вы можете изменить условие:

if params[:search] 

, а затем найти по:

Article.find_by(title: params[:search])