Как сделать по желанию: условия для нахождения - PullRequest
0 голосов
/ 30 июня 2010

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

Я создал помощника, с помощью параметра принимаети объединить хэш с параметрами:

В моем контроллере:

@bills = adminbill_filter(:limit=>params[:limit] || 50,:offset=>params[:offset] || 0, :conditions=>params[:options])

В моем помощнике:

  def link_to_with_current(text, link, condition, *args)
    options = args.first || {}
    options[:class] = condition ? 'current' : nil
    link_to text, link, options
  end

На мой взгляд:

<%= text_field :filter ,:criteria, :class=>'roundRect',:id=>'name', :value=>12009%>
<%= button_to_with_filter 'Start Filter', 'index', :filter_condition=>true, :options=>{:id=>81}%>

Можно ли каким-то образом передать значение text_field в: option => {...} button_to_with_filter?Я нахожу это решение (если оно работает) довольно неудобным.Ваши комментарии как всегда очень полезны.

Привет Матиас

Ответы [ 3 ]

1 голос
/ 30 июня 2010

Если текстовое поле и кнопка были инкапсулированы в форму, а кнопка была кнопкой отправки, значение текстового поля будет автоматически занесено в хэш параметров.Тогда вам не придется иметь дело с этим.Сейчас я не могу вспомнить точных помощников Rails, которые сделают это за вас, но вы хотите, чтобы полученная форма, вероятно, была примерно такой:

<% form_for :options, :url => {:action => :index}, :html => { :method => :get } do |f| %>
<%= f.text_field :filter ,:criteria, :class=>'roundRect',:id=>'name', :value=>12009%>
<%= f.submit 'Start Filter' %>
<% end %>

Что может изменить некоторые, так как я неНе знаю, какой код лежит в основе ваших методов.

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

1 голос
/ 30 июня 2010

Кажется ужасным вводить содержимое представленных пользователем параметров, не проверяя их в любом качестве.Вы, вероятно, столкнетесь со всеми видами исключений, если данные поступают не так, как ожидалось, или они сформулированы как вредоносные.

def index
  bills_scope = Bill

  # Use an example Bill.with_id scope
  if (params[:with_id])
    bills_scope = bills_scope.with_id(params[:with_id])
  end

  # Repeat as required

  # Finally, use the scope to retrieve matching records
  @bills = bills_scope.paginated
end

Использование чего-то вроде will_paginate может помочь с вашими смещением и предельными значениями.

0 голосов
/ 05 июля 2010

Спасибо за вашу помощь, я наткнулся на named_scope и решил проблему с помощью следующего кода:

Модель Билла:

class Bill < ActiveRecord::Base
  # named_scope werden fuer Filterfunktionen bei Adminbill benoetigt
  named_scope :standard, :order => "created_at DESC"
  named_scope :limit, lambda {|*args| {:limit=>(args.first)|| 50}}
  named_scope :offset, lambda {|*args| {:offset=>(args.first || 10)}}
  named_scope :paid, :conditions=>"paid IS NOT NULL"
  named_scope :not_paid, :conditions=>{:paid=>nil}
  named_scope :test_bill, :conditions => {:test_bill=>true}
  named_scope :no_test_bill, :conditions => {:test_bill=>false}
  named_scope :find_via_bill_id, lambda {|*args|{:conditions=>{:id=>(args.first || 210)}}}
  named_scope :find_via_email, lambda {|*args| {:conditions=>{:buyer_id=>args.first}}}

Контроллер:

  def index
logger.debug "The object is #{current_user}"

if params[:filterInput] != nil && !params[:filterInput].empty?
  filter_array = params[:filterInput].split('&')
  bill_scope = Bill.scoped({})
  bill_scope = bill_scope.standard

  # Filtere via Regexp-Matching die Zahlen der Eingabe heraus 
  filter_array.each do |el|
    if el =~ /limit\([0-9]+\)/
      number = 
      bill_scope = bill_scope.limit(el.scan(/\d+/)[0])
    elsif el =~ /offset\([0-9]+\)/
      bill_scope = bill_scope.offset(el.scan(/\d+/)[0])
    elsif el == 'paid'
      bill_scope = bill_scope.paid
    elsif el == 'not_paid'
      bill_scope = bill_scope.not_paid
    elsif el == 'test_bill'
      bill_scope = bill_scope.test_bill
    elsif el =~ /find_via_bill_id\([0-9]+\)/
      bill_scope = bill_scope.find_via_bill_id(el.scan(/\d+/)[0])
    elsif el =~ /find_via_email\([A-Za-z0-9.@-]+\)/
      email = el.scan(/\([A-Za-z0-9.@-]+\)/)[0]
      # TODO geht bestimmt auch eleganter durch besseres Matching
      email = email.gsub("(", "")
      email = email.gsub(")", "")
      user =  User.find_by_email(email) unless User.find_by_email(email).blank?
      bill_scope = bill_scope.find_via_email(user.id)
    end
  end
  @bills = bill_scope
else 
  @bills = Bill.standard.limit.offset
end

А в представлении:

<% form_tag(:action => 'index') do %>
   <%= text_field_tag 'filterInput', nil, :size => 40 %> 
  <%= submit_tag 'Start Filter'%>
<% end %>

Теперь вы можете передать в поле tex, например, следующее действительное выражение: paid & limit (20) Я знаю, что решение контроллера не очень элегантно, но для меня это был самый быстрый способ решить эту проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...