2016-03-14 5 views
0

В настоящее время у меня есть БД в Ruby on Rails, однако у меня возникли проблемы с документацией о том, как сделать многое, кроме списка всех элементов в БД. Я все еще новичок в этом языке в целом и хочу, чтобы мне не нужно было так много помогать, но вот оно. Мой уместна код выглядит следующим образом:Поиск в Ruby-on-Rails DB

migrate/(DB name)

class CreateArticles < ActiveRecord::Migration 
    def change 
    create_table :articles do |t| 
     t.string :title 
     t.text :text 

     t.timestamps null: false 
    end 
    end 
end 

articles_controller.rb

class ArticlesController < ApplicationController 
    def index 
    @articles = Article.all 

    Article.search(params[:id]) 
    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 = Article.where('name LIKE ?', "%#{search}%") 
    else 
     @article = Article.all 
    end 
    end 

end 

index.html.rb

<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", :name => nil %> 
    </p> 
<% end %> 

</table> 

Спасибо за любую помощь заранее!

ответ

1

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

class ArticlesController < ApplicationController 
    def index 
    @articles = Article.search(params[:search]) 
    end 
end 

article.rb

class Article < ActiveRecord::Base 

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

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

Так что теперь метод класса делает поиск, возвращает коллекцию к контроллеру, который присваивает их переменный экземпляр для использования в представлении.

+0

ha, вы пропустили «имя»;) –

+0

Правда, просто скопировано, что из вопроса OP –

+0

теперь я получаю 'Параметры: {" search "=>" asd "," utf8 "=>" ✓ " } Задание статьи (0,5 мс) ВЫБРАТЬ «статьи». * FROM «articles» 'на бэкэнд без изменений на лицевой стороне –

0

У вас есть ваша поисковая форма, убедитесь, что это GET. Хорошо. Когда вы нажмете поиск, вы заметите в своем журнале разработки, что есть articles#index, и браузер покажет то же, что и раньше. Чтобы сделать поиск, измените метод index в контроллере статей.

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

В Article.search у вас есть name, где вы должны иметь title.

PS: У вас есть метод show немного неправильный.

+0

спасибо, плохо посмотрите на шоу, но с точки зрения поиска, на бэкэнд я все еще не вижу правильный 'Select' при вызове,' Parameters: {"search" => "asd", "utf8" => "✓"} Article Load (0.1ms) SELECT "articles". * FROM "articles" 'это то, что Я получил от бэкенда –

+0

Hm, может быть 'Article.search (params [: search])' тогда, как предложил j-dexx. Мой мангоид не слишком беспокоится о '.all'. –

+0

Нет, он по-прежнему видит поиск, но только выполняет статьи «SELECT». * FROM «articles» ' –

Смежные вопросы