2010-06-25 2 views
0

Je suis débutant en Ruby on Rails, j'ai donc besoin d'un peu d'aide. J'ai commencé à lire un tutoriel de base récemment, qui a été enseigné en utilisant Scaffolding. J'ai fait un modèle "Clients": script/Générer nom des clients d'échafaudage: string ip_address: vitesse de chaîne: entier ... A l'intérieur du fichier clients_controller.rb, il y a une méthode appelée show:Ruby on Rails Echafaudage - 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 

Pour les requêtes, je d aller à localhost: 3000/clients/{Entrez l'ID ici}. Au lieu de rechercher avec l'ID, je voudrais rechercher avec une autre valeur, comme ip_address ou speed, donc je pensais que tout ce que je devrais faire est de changer: id en: ip_address dans "@client = Client.find (params [: id]) ". Cependant, cela ne fonctionne pas, alors quelqu'un pourrait me dire comment je peux effectuer une recherche avec un autre paramètre. Merci!

Répondre

1

Cela ne fonctionne pas à cause de la façon dont les choses sont acheminés

Quand vous faites quelque chose comme

map.resources :client (Voir config/routes.rb)

Ceci se produit automatiquement lorsque vous utilisez échafaudage. Il configure les routes en supposant que vous utilisez un ID.

L'une de ces voies est quelque chose comme

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

Alors :id est passé en tant que paramètre dans le cadre de l'URL.

Vous ne devriez pas avoir l'IP comme identificateur principal à moins qu'ils ne soient distincts - et même alors, cela dérange le routage RESTful.


Si vous voulez avoir la possibilité de rechercher par IP, modifier votre action d'index pour les clients

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

Ensuite, vous pouvez effectuer une recherche par ip en allant clients?ip=###.###.###

0

Cette ligne votre fichier routes.rb

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

implique que lorsque le répartiteur reçoit un URI au format "clients/abcdxyz" avec la méthode GET, il le redirigera vers la méthode show avec la valeur "abcdxyz" disponible dans params hash avec la clé: id.

EDIT


Puisque vous avez utilisé échafaudage, la ressource de clients sera RESTful. Cela signifie que lorsque vous envoyez une requête GET à «/clients /: id » URI, vous allez être redirigé pour afficher la page de ce client particulier


Dans votre code de contrôleur, vous pouvez y accéder en

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

La méthode de recherche générée par les recherches d'échafaudage sur la clé primaire, c'est-à-dire la colonne 'id'.Vous devez changer cette déclaration soit

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

OU

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

:-)

+0

Il échafaudés, que je suis assez sûr crée une ligne 'de map.resources', pas' map.connect' –

+0

oups .... ouais .... merci de le signaler – Jagira