在Ruby-on-Rails DB中搜索字段

时间:2016-03-14 13:48:07

标签: ruby-on-rails ruby search textbox

我目前在Ruby on Rails中有一个数据库,但是,除了列出数据库中的所有项目之外,我一直遇到有关如何做更多事情的文档的问题。作为一个整体来说,我仍然对这种语言不熟悉,并希望我不需要寻求这么多的帮助,但现在就这样了。我的相关代码如下:

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>

提前感谢您的帮助!

2 个答案:

答案 0 :(得分: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

现在,类方法执行搜索,将集合返回给控制器,控制器将它们分配给实例变量以供在视图中使用。

答案 1 :(得分:0)

您已获得搜索表单,请确保这是一个GET。好。当您点击搜索时,您会在开发日志中注意到articles#index有点击,浏览器会显示与之前相同的内容。要使搜索内容编辑文章控制器中的index方法。

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

Article.search name,您应该有一个title

PS:你的show方法有点不对。