2

Utilisation Rails 4 et rubis 2.2, j'ai mon modèle d'utilisateur qui a les attributs suivantschamps de recherche multiples dans les rails 4

  1. nom d'utilisateur
  2. email
  3. actif

Maintenant, j'ai besoin de créer un champ de texte de recherche pour le nom d'utilisateur, email et déroulant pour les attributs actifs. J'ai mon

user.rb

def self.usernames(username) 
     user = all 
     user = user.where("username LIKE ?", "%#{username}%") 
     return user 
    end 


    def self.emails(email) 
    user = all 
    user = user.where("email LIKE ?", "%#{email}%") 
    return user 
    end 


    def self.actives(active) 
    user = all 
    user = user.where("active LIKE ?", "%#{active}%") 
    return user 

users_controller.rb

def index 
    @users = User.all 
    @users = @users.usernames(params[:username]) if params[:username].present? 
    @users = @users.emails(params[:email]) if params[:email].present? 
    @users = @users.actives(params[:active]) if params[:active].present? 
    end 

index.html.erb

h1>Listing Users</h1> 

<div id="forms"> 
    <%= form_tag users_path, :method=> "get" do %> 

     <%= label_tag :username, "Name" %> 
     <%= text_field_tag :username %> 

     <%= label_tag :email, "Email" %> 
     <%= text_field_tag :email%> 

     <%= label_tag :active, "Active" %> 
     <%= select_tag :active, options_for_select([['Active', true], ['Inactive', false]]) %> 
     <%= submit_tag "Search" %> 
     <%= link_to "Clear Search", request.path, class:"cancel-button" %> 
    <% end %> 

</div> 
<div id="users"><%= render "users" %></div> 


<%= button_to "Create User", new_user_path, method: :get %> 

schema.rb

create_table "users", force: :cascade do |t| 
    t.string "email",     limit: 255, default: "", null: false 
    t.string "encrypted_password",  limit: 255, default: "", null: false 
    t.string "reset_password_token", limit: 255 
    t.datetime "reset_password_sent_at" 
    t.datetime "remember_created_at" 
    t.string "name",     limit: 255 
    t.integer "sign_in_count",   limit: 4, default: 0,  null: false 
    t.datetime "current_sign_in_at" 
    t.datetime "last_sign_in_at" 
    t.string "current_sign_in_ip",  limit: 255 
    t.string "last_sign_in_ip",  limit: 255 
    t.string "confirmation_token",  limit: 255 
    t.datetime "confirmed_at" 
    t.datetime "confirmation_sent_at" 
    t.string "unconfirmed_email",  limit: 255 
    t.integer "failed_attempts",  limit: 4, default: 0,  null: false 
    t.string "unlock_token",   limit: 255 
    t.datetime "locked_at" 
    t.datetime "created_at" 
    t.datetime "updated_at" 
    t.string "username",    limit: 255 
    t.boolean "active",        default: false 

Maintenant, quand je suis en train de filtrer par nom d'utilisateur ou e-mail, il ne me donne aucun résultat.

Voici le résultat dans la console,

Started GET "/users?utf8=%E2%9C%93&username=alok&email=&active=true&commit=Search" for ::1 at 2016-04-18 13:10:09 +0530 
Processing by UsersController#index as HTML 
    Parameters: {"utf8"=>"✓", "username"=>"alok", "email"=>"", "active"=>"true", "commit"=>"Search"} 
    User Load (1.0ms) SELECT `users`.* FROM `users` WHERE `users`.`id` = ? ORDER BY `users`.`id` ASC LIMIT 1 [["id", 11]] 
{"utf8"=>"✓", "username"=>"alok", "email"=>"", "active"=>"true", "commit"=>"Search", "controller"=>"users", "action"=>"index"} 
    User Load (1.0ms) SELECT `users`.* FROM `users` WHERE (username LIKE '%alok%') AND (active LIKE '%true%') 
    Rendered users/_users.html.erb (7.2ms) 
    Rendered users/index.html.erb within layouts/application (49.3ms) 
Completed 200 OK in 671ms (Views: 550.7ms | ActiveRecord: 49.9ms) 

J'ai mentionné le post suivant, mais obtenir des résultats similaires, pas de sortie, S'il vous plaît laissez-moi savoir si je manque quelque chose,

Multiple search fields in rails

+0

De quel type est l'attribut « actif » dans votre modèle utilisateur? – mentalic

+0

booléen et par défaut à false – cyborg

Répondre

0

On dirait que le problème est dans la fonction def self.actives (active)

Essayez le changement à

def self.actives(active) 
    user = all 
    user = user.where("active = ?", active) 
    return user 
end 

Vous pouvez également essayer le joyau Ransack afin d'ajouter facilement/supprimer des champs à un formulaire de recherche https://github.com/activerecord-hackery/ransack

+0

Merci, son fonctionnement maintenant – cyborg