2010-06-25 4 views
0

Я новичок, когда дело доходит до Ruby on Rails, поэтому мне нужно немного помочь. Недавно я начал читать базовый учебник, который преподавался с использованием лесов. Я сделал «Клиенты» модель: сценарий/генерировать подмости клиентов имя: строка ip_address: скорость строки: целое ... Внутри файл clients_controller.rb, есть метод, который называется шоу:Ruby on Rails Scaffold - Modify Show Method

# 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 

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

ответ

1

Это не работает из-за того, как вещи направляются

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

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

Эта линия в ваш файл routes.rb

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

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

EDIT


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


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

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

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

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

ИЛИ

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

:-)

+0

Он scaffolded, который я уверен, что создает 'map.resources' линию, а не' map.connect' –

+0

oops .... да .... спасибо за указание на то, что – Jagira