Ruby on Rails Scaffold - модифицированный метод показа - PullRequest
0 голосов
/ 25 июня 2010

Я начинающий, когда дело доходит до Ruby on Rails, поэтому мне нужно немного помочь. Недавно я начал читать базовый учебник, который преподавался с использованием скаффолдинга. Я сделал модель "Клиенты": скрипт / сгенерировать имя клиента скаффолда: строка ip_address: скорость строки: целое число ... Внутри файла clients_controller.rb есть метод с именем show:

  # GET /clients/1
  # GET /clients/1.xml
  def show
    @client = Client.find(params[:id])

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

Для запросов я бы пошел на localhost: 3000 / клиентов / {Введите здесь идентификатор}. Вместо поиска по идентификатору - аргумент, я хотел бы искать с другим значением, таким как ip_address или speed, поэтому я подумал, что все, что мне нужно сделать, это изменить: id на: ip_address in "@client = Client.find ( Титулы [: идентификатор])». Тем не менее, это не работает, поэтому кто-то, пожалуйста, скажите мне, как я могу выполнить поиск с другим параметром. Спасибо!

Ответы [ 2 ]

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

Это не работает из-за способа маршрутизации вещей

Когда вы делаете что-то вроде

map.resources :client (см. config/routes.rb)

Это происходит автоматически при использовании эшафот. Он устанавливает маршруты на основе предположения, что вы используете идентификатор.

Один из этих маршрутов похож на

map.connect 'clients/:id', :controller => 'client', :action => 'show'

Таким образом, :id передается как параметр как часть URL.

Вы не должны иметь IP-адрес в качестве основного идентификатора, если они не различаются - и даже в этом случае он как бы портит RESTful-маршрутизацию.


Если вы хотите иметь возможность поиска по IP, измените действие индекса для клиентов

def index
  if params[:ip].present?
    @clients = Client.find_by_ip_address(params[:ip]);
  else
    @clients = Client.all
  end
end

Тогда вы можете искать по ip, перейдя на clients?ip=###.###.###

0 голосов
/ 26 июня 2010

Эта строка в вашем файле rout.rb

map.connect 'clients/:id', :controller => 'client', :action => 'show'

подразумевает, что, когда диспетчер получает URI в формате «clients / abcdxyz» с методом GET, он перенаправляет его для отображения метода со значением"abcdxyz" доступен в хэше params с ключом: id.

EDIT


Поскольку вы использовали скаффолд, ресурс клиентов будет RESTful. Это означает, что при отправке запроса GETна "/ clients /: id 'URI, вы будете перенаправлены на отображение страницы этого конкретного клиента.


В коде вашего контроллера вы можете получить к нему доступ как

params[:id] # which will be "abcdxyz"

метод find, сгенерированный поиском скаффолда по первичному ключу, т.е. столбцу id.Вам нужно изменить это утверждение на

@client = Client.find_by_ip_address(params[:id]) #find_by_column_name

ИЛИ

@client = Client.find(:first, :conditions => [":ip_address = ?", params[:id]])

: -)

...