0

今 app/views/microposts/home.html.erb にあります..

<% form_tag purchases_path, :method => 'get', :id => "products_search" do %>
  <p>
    <%= text_field_tag :search, params[:search] %>
    <%= submit_tag "Search", :name => nil %>
  </p>
<% end %>

<% form_tag sales_path, :method => 'get', :id => "sales_search" do %>
      <p>
        <%= text_field_tag :search, params[:search] %>
        <%= submit_tag "Search", :name => nil %>
      </p>
    <% end %>

そしてmicropost.rbで私は持っています

scope :purchases, where(:kind => "purchase")
  scope :sales, where(:kind => "sale")

 def self.search(search)
    if search
      where('name LIKE ?', "%#{search}%")
    else
      scoped
    end
  end

そして最後に私が持っているmicroposts_controller.rbで

    def home

    @microposts=Micropost.all
    @purchases=@microposts.collect{ |m| m if m.kind == "purchase"}.compact
    @sales=@microposts.collect{ |m| m if m.kind == "sale"}.compact

  end

編集:

私も使ってみました

def home

    @microposts=Micropost.all
    @purchases=@microposts.purchases
    @sales=@microposts.sales

  end

代わりに、エラー undefined method `purchases' for # が表示されます

アンウェイズ、

現在、.collect メソッドを使用すると、未定義のローカル変数またはメソッド「purchases_path」というエラーが表示され、sales_path についても同じことが起こります。

私が欲しいのは、2つの検索フォームを持つことです。私のマイクロポストテーブルには、「購入」または「販売」のいずれかになる種類という列があります。1 つの検索フォームが「購入」という種類のマイクロポストのみを検索して結果を表示するようにコードを変更するにはどうすればよいですか。そして、もう一方は、種類が「セール」のマイクロポストのみを検索して結果を表示します。

4

5 に答える 5

0

'/microposts/home' が MictropostsController#home app/views/microposts/home.html.erbにマップされている場合の仮定

<%= form_tag('/microposts/home', :method => :get) do
 <%= text_field_tag 'kind'%>
 <%= submit_tag 'Search' %>
%>

/app/controllers/microposts_controller.rb

def home
  kind = params[:kind]
  if kind.present?
    # if search parameter passed
    @microposts = Micropost.where(:kind => kind)
  else
    # if search parameter not passed, list all micro post
    @microposts = Micropost.all
  end
end
于 2012-09-27T04:50:35.430 に答える
0

さて、sales_path と purchases_path があるので、どちらも sales アクションと purchases アクションを持つコントローラーにつながると仮定します。

def sales
  @search = params[:search]
  @microposts = Micropost.search(@search).sales
end

def purchases
  @search = params[:search]
  @microposts = Micropost.search(@search).purchases
end

メソッドはMicropost.searchスコープを返します。したがって、そのスコープで #sales または #purhases を呼び出して、クエリに条件を追加します。

アップデート

1 つのフォームから 2 種類のマイクロポストを検索したいようです。

アプリ/ビュー/ホーム/index.html.erb

<%= form_tag(root_path, :method => :get) do
 <%= text_field_tag 'search'%>
 <%= submit_tag 'Search' %>
%>

アプリ/モデル/micropost.rb

scope :purchase_or_sale, where("kind IN ?", ["purchase", "sale"])
def self.search(search)
  if search
    where('name LIKE ?', "%#{search}%")
  else
    scoped
  end
end

def purchase?
  kind == "purchase"
end

def sale?
  kind == "sale"
end

/app/controllers/home_controller.rb

def home
  @microposts = Micropost.search(params[:search]).purchase_or_sale
  @purchases = @microposts.select(&:purchase?)
  @sales = @microposts.select(&:sale?)  
end

更新 2

わかりました、もう 1 つ更新します.... ここにあなたが今欲しいと思うものがあります: 2 つの検索フォーム、両方とも /microposts ... 販売フォームで検索すると、販売が表示されます。購入フォームで検索すると、購入が検索されます。

あなたの見解:

<%= form_tag(microposts_path(kind: "purchases", :method => :get) do
 <label for="search">Search Purchases:</label>
 <%= text_field_tag 'search' %>
 <%= submit_tag 'Search' %>
%>

<%= form_tag(microposts_path(kind: "sales", :method => :get) do
 <label for="search">Search Sales:</label>
 <%= text_field_tag 'search' %>
 <%= submit_tag 'Search' %>
%>

あなたのコントローラー:

def index
  @microposts = Micropost.search(params[:search).for_kind(params[:kind])
end

あなたのモデル

def self.search(search_text)
  if search_text
    where('name LIKE ?', "%#{search_text}%")
  else
    scoped
  end
end

scope :for_kind, lambda{|search_kind| where(kind: search_kind) }
于 2012-09-27T02:30:53.823 に答える
0

マイクロポスト モデルを継承する 2 つの新しいモデルにマイクロポストを分割してみませんか?

class Micropost < ActiveRecord::Base

  #do your general micropost magic here

end

次:

class Purchase < Micropost

  #do your purchase specific magic here

end

と:

class Sale < Micropost

  #do your sale specific magic here

end

あなたのホーム アクション:

def home

  @microposts = Micropost.all
  @purchases = Purchase.all
  @sales = Sale.all

end

購入を検索する必要がある場合:

Purchase.where(:something => "great")

Sales を検索する必要がある場合:

Sale.where(:something => "greater")

両方を検索する必要がある場合:

Micropost.where(:something => "the greatest")

** 注 ** これを機能させるには、マイクロポスト テーブルに列「タイプ」を追加する必要があります。詳細については、単一テーブルの継承 @ http://api.rubyonrails.org/classes/ActiveRecord/Base.html

于 2012-10-02T14:07:19.520 に答える
0

別の応答に対するあなたのコメントによると:

def home
  @microposts = Micropost.scoped # so you can later apply any scope
  if params[:purchases_search].present?
    @microposts = @microposts.purchases.search(params[:purchases_search])
  elsif params[:sales_search].present?
    @microposts = @microposts.sales.search(params[:sales_search])
  end
end

これは、2 つの検索フィールドの名前が「purchases_search」と「sales_search」であることを前提としています。

于 2012-09-28T16:20:34.573 に答える
0
def home
  @microposts = Micropost.all
  @purchases = Micropost.search("purchase", params[:search])
  @sales = Micropost.search("sale", params[:search])
end

def self.search(kind = nil, search = nil)
  results = self.where(:kind => kind) if kind
  results = self.where('name LIKE ?', "%#{search}%") if name
end
于 2012-09-25T03:25:12.590 に答える