Как добавить возможность поиска в приложение rails 3, используя названную область? - PullRequest
0 голосов
/ 18 апреля 2011

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

Вот код для модели trap.rb:

class Trap < ActiveRecord::Base
 scope :by_date_entry, lambda { |arg| where(["traps.date_entry = ?",arg])}

 scope :by_empcode, lambda { |arg| where(["traps.empcode = ?",arg])}
end

В контроллере traps_controller.rb:

class TrapsController < ApplicationController
 # GET /traps
 # GET /traps.xml
 def index
  @traps = Trap.all

  respond_to do |format|
   format.html # index.html.erb
   format.xml  { render :xml => @traps }
  end
 end

 # GET /traps/1
 # GET /traps/1.xml
 def show
  @trap = Trap.find(params[:id])

  respond_to do |format|
   format.html # show.html.erb
   format.xml  { render :xml => @trap }
  end
 end

 # GET /traps/new
 # GET /traps/new.xml
 def new
  @trap = Trap.new

  respond_to do |format|
   format.html # new.html.erb
   format.xml  { render :xml => @trap }
  end
 end

 # GET /traps/1/edit
 def edit
  @trap = Trap.find(params[:id])
 end

 # POST /traps
 # POST /traps.xml
 def create
  @trap = Trap.new(params[:trap])

  respond_to do |format|
   if @trap.save
    format.html { redirect_to(@trap, :notice => 'Trap was successfully created.') }
    format.xml  { render :xml => @trap, :status => :created, :location => @trap }
   else
    format.html { render :action => "new" }
    format.xml  { render :xml => @trap.errors, :status => :unprocessable_entity }
   end
  end
 end

 # PUT /traps/1
 # PUT /traps/1.xml
 def update
  @trap = Trap.find(params[:id])

  respond_to do |format|
   if @trap.update_attributes(params[:trap])
    format.html { redirect_to(@trap, :notice => 'Trap was successfully updated.') }
    format.xml  { head :ok }
   else
    format.html { render :action => "edit" }
    format.xml  { render :xml => @trap.errors, :status => :unprocessable_entity }
   end
  end
 end

 # DELETE /traps/1
 # DELETE /traps/1.xml
 def destroy
  @trap = Trap.find(params[:id])
  @trap.destroy

  respond_to do |format|
   format.html { redirect_to(traps_url) }
   format.xml  { head :ok }
  end
 end
end

А на мой взгляд index.html.erb:

<h2>Time Reconciliation Application for Payroll 1.0</h2>

<table>
 <tr>
  <th>Empcode</th>
  <th>Date entry</th>
  <th></th>
  <th></th>
  <th></th>
 </tr>

 <% @traps.each do |trap| %>
 <tr>
  <td><%= trap.empcode %></td>
  <td><%= trap.date_entry %></td>
  <td><%= link_to 'Show', trap %></td>
  <td><%= link_to 'Edit', edit_trap_path(trap) %></td>
  <td><%= link_to 'Destroy', trap, :confirm => 'Are you sure?', :method => :delete %></td>
 </tr>
 <% end %>
</table>

<br />

<%= link_to 'New Trap', new_trap_path %>

Я хочу поставить как текстовое поле поиска, в котором пользователь может ввести код employee_entry или date_entry в index.html.erb. Я сделал что-то подобное, используя meta_search и meta_where, но я бы предпочел использовать named_scope, но я не знаю, как отобразить это, используя view и controller. Коды в моей модели trap.rb работают на моей консоли. Я просто не знаю, как заставить это появиться в представлении. Просьба помочь ...

Ответы [ 2 ]

3 голосов
/ 18 апреля 2011

Я бы, вероятно, сделал что-то подобное в контроллере:

def index
  # the scoped method returns a prepared database call with 
  # no arguments so the database is not called yet.
  @traps = Trap.scoped

  # if any parameter to filter is supplied then use the scope
  @traps = @traps.by_date_entry(params[:date_entry]) if params[:date_entry]
  @traps = @traps.by_empcode(params[:empcode]) if params[:empcode]
end

И затем в представлении, вы можете либо пойти с формой для отправки параметров, или если вы просто хотите попробовать это тогдасоздайте ссылку для определенных дат или кодов наподобие этого:

<td><%= link_to trap.date_entry, traps_path(:date_entry => trap.date_entry) %></td>

, чтобы при нажатии на ссылку она отправляла date_entry для использования вашей областью.Кстати, traps_path, конечно, действителен только до тех пор, пока вы указали ресурсы: traps в ваших маршрутах. Rb

0 голосов
/ 20 июля 2011

Я также нашел этот Railscast на эту тему полезным:

http://railscasts.com/episodes/215-advanced-queries-in-rails-3

...