2017-07-18 6 views
0

Essaie de stocker des objets dans un tableau pour parcourir la vue.Objets jetables Rails dans le contrôleur

Dans mon contrôleur:

def expire 
    @search = Search.new(search_params) 
    if @search.valid? 
    @clients = [] 
    @allClients = #value from REST API 
    @allClients.each do |client| 
     @clientele = Clientele.new 
     @clientele["exp"] = client.experience ##Also tried @clientele.exp = client.experience 
     @clientele["email"] = client.email ##Also tried @clientele.email = client.email 
     @clients.push(@clientele) 
    end 
    end 
end 
class Clientele 
    def exp 
    end 
    def email 
    end 
end 

Dans mon rien DEMONTRERAIT et montrant le tableau @clients donne un tableau vide:

<% @clients.each do |client| %> 
    <%= client.exp %> 
    <%= client.email %> 
<% end %> 
<%= clients %> #=> [] 

Je ne sais pas ce que je fais mal , Je n'arrive pas à créer un objet temporaire pour stocker des valeurs et les stocker dans un tableau. Toute aide ou suggestion serait utile.

Répondre

0

Vous n'initialisez jamais @allClients (au moins dans le code fourni). Ainsi, @allClients est nil et @allClients.each ne produit rien.

Essayez quelque chose comme:

def expire 
    @search = Search.new(search_params) 
    if @search.valid? 
    @clients = Client.all.map do |client| 
     Clientele.new(
     exp: client.experience, 
     email: client.email 
    ) 
    end 
    end 
end  

L'utilisation map renvoie un Array peuplé par le résultat du bloc (qui est un objet initialisé Clientele).

Allez-vous ajouter du code? Je suppose que vous êtes. Parce que, comme actuellement écrit, l'ensemble de l'instanciation Clientele semble un peu inutile.

Vous pouvez faire votre classe Clientele comme ceci:

class Clientele 

    def initialize(params={}) 
    params.each do |k,v| 
     class_eval{attr_accessor k} 
     send("#{k}=",v) 
    end 
    end 

end 

Et vous serez en mesure de ce instancier la façon dont je montre. Le bit class_eval crée les getters et les setters. Le bit send attribue les paramètres transmis à leurs variables respectives.

Si vous voulez sauter la classe tout à fait Clientele, vous pouvez faire:

def expire 
    @search = Search.new(search_params) 
    if @search.valid? 
    @clients = Client.all.map do |client| 
     {exp: client.experience, email: client.email} 
    end 
    end 
end 

Dans ce cas, vous devrez changer votre erb à:

<% @clients.each do |client| %> 
    <%= client[:exp] %> 
    <%= client[:email] %> 
<% end %> 
<%= clients %> #=> [] 

Ou, si vous aimez votre erb comme il est, vous pouvez faire:

def expire 
    @search = Search.new(search_params) 
    if @search.valid? 
    @clients = Client.all.map do |client| 
     OpenStruct.new(exp: client.experience, email: client.email) 
    end 
    end 
end 

Dans ce cas, vous pouvez sti J'effectuais:

<% @clients.each do |client| %> 
    <%= client.exp %> 
    <%= client.email %> 
<% end %> 
<%= clients %> #=> [] 
+0

J'essayais de réduire mon code pour qu'il soit plus facile de comprendre ce que j'essayais de faire. J'utilise une API REST qui me donne un tableau de clients, chacun avec une liste de définitions/éléments. – Corey

+0

'Clientele.new' me donne un mauvais nombre d'arguments (1 pour 0)' erreur. :( – Corey

+0

Oh, désolé, je n'ai pas vu ça à propos de votre classe 'Clientele' dans votre OP Je vais mettre à jour – jvillian