2017-04-14 1 views
0

J'essaie d'écrire un filtre pour la table. Voici le code:Formulaire de recherche Ne pas mettre à jour la table dans RoR

.../modèles/message.rb

Class Message < ActiveRecord::Base 
    include Filterable 

    belongs_to :user 
    default_scope -> { order('created_at DESC') } 
    validates :user_id, presence: true 
    validates :content, presence: { message: "Выберите файл послания для загрузки!" }, file_size: { less_than_or_equal_to: 20.megabytes } 
    validates :fromdate, presence: true 
    validates :tilldate, presence: true 
    mount_uploader :content, ContentUploader 

    scope :id, -> (id) {where id: id } 
    scope :tariff, -> (tariff) { where tariff: tariff } 
    scope :status, -> (status) { where("status like ?", "#{status}%")} 

end 

.../contrôleurs/préoccupations/filterable.rb

module Filterable 
    extend ActiveSupport::Concern 

    module ClassMethods 
    def filter(filtering_params) 
     results = self.where(nil) 
     filtering_params.each do |key, value| 
     results = results.public_send(key, value) if value.present? 
     end 
     results 
    end 
    end 
end 

.../contrôleurs/messages_controller .rb

... 
def index 
    @messages = Message.filter(params.slice(:id, :tariff, :status)).paginate(page: params[:page], :per_page => 10) 
end 
... 

.../vues/messages/index.html.erb

... 
<table class="table table-bordered"> 
    <thead> 
     <tr> 
     <th>Клиент</th> 
     <th>№</th> 
     <th>Дата</th> 
     <th>Послание</th> 
     <th>Тариф</th> 
     <th>Показ с</th> 
     <th>до</th> 
     <th>Стоимость, р.</th> 
     <th>Статус</th> 
     <% if current_user.admin? %> 
      <th>Модератор</th> 
     <% end %> 
     </tr> 
    </thead> 
    <tbody> 
     <tr> 
     <%= form_tag messages_path, method: "get" do %> 
     <td><%= text_field_tag "client" %></td> 
     <td><%= text_field_tag "id", nil, size: 1 %></td> 
     <td></td> 
     <td><%= submit_tag "Выбрать" %><br><br><%= button_tag "Очистить" %></td> 
     <td><%= select_tag "tariff", options_for_select(["", "1. Вечер", "2. Весь день", "1001. ВЕЧЕР БЕСПЛАТНО", "1002. ДЕНЬ БЕСПЛАТНО"]), {} %></td> 
     <td></td>  
     <td></td> 
     <td></td> 
     <td><%= select_tag "status", options_for_select(["", "В обработке", "Исполняется", "Отклонена", "Выполнена"]), {} %></td> 
     <td></td> 
     <% end %> 
     </tr> 
     <%= render @messages %> 
    </tbody> 
    </table> 
</div> 
... 

.../vues/messages/_message.html.erb

... 
<% case message.status 
    when "В обработке" 
     @messagecolor="warning" 
    when "Исполняется" 
     @messagecolor="success" 
    when "Выполнена" 
     @messagecolor="info" 
    when /Отклонена.*/ 
     @messagecolor="danger" 
    end 

    unless message.moderator.nil? 
    @moderator = User.find(message.moderator).name 
    end 
%> 

<tr class=<%= @messagecolor %> data-message_id="<%= message.id %>"> 
    <% if current_user.admin? || current_user.role == "Модератор" %> 
    <td><%= message.user.name %></td> 
    <% end %> 
    <td><%= message.id %></td> 
    <td><%= message.created_at.strftime("%d/%m/%Y %T %z") %></td> 
    <td><img src="<%= message.content_url(:thumb) %>" data-toggle="modal" data-target="#myModal" data-content="<%= message.content_url%>"></td> 
    <td><%= message.tariff %></td> 
    <td><%= message.fromdate.strftime("%d/%m/%Y") %></td> 
    <td><%= message.tilldate.strftime("%d/%m/%Y") %></td> 
    <td><%= message.cost %></td> 
    <td class="status"> 
    <%= message.status %> 
    <% if (current_user.admin? || current_user.role == "Модератор") && message.status == "В обработке" %> 
     <br> 
     <div class="btn-group"> 
     <button type="button" class="btn btn-success" data-status="Исполняется" data-message_id="<%= message.id %>">Принять</button> 
     <button type="button" class="btn btn-danger" data-status="Отклонена" data-message_id="<%= message.id %>">Отклонить</button> 
     </div> 
    <% end %> 
    <% if (current_user.admin? || current_user.role == "Модератор") && message.status == "Исполняется" %> 
     <br> 
     <%= link_to "Изменить", edit_message_path(message.id), :class => "btn btn-info" %> 
    <% end %> 
    </td> 
    <% if current_user.admin? %> 
     <td class="moderator"> 
     <%= @moderator %><br> 
     <%= message.updated_at.strftime("%d/%m/%Y %T %z")%> 
     </td> 
    <% end %> 
</tr> 
... 

Le filtre fonctionne uniquement après que la page est actualisée. Il vaut la peine de revenir à la page à travers le menu - le bouton de formulaire ne fonctionne pas, mise à jour par F5 - cela fonctionne. Pourquoi?

Je vous serais également reconnaissant si vous me dites comment enregistrer les valeurs de filtre sélectionnées dans les champs après son application.

Répondre

0

J'ai trouvé la réponse à ma question principale: il faut inclure toute la table dans la forme .../vues/messages/index.html.erb

... 
<%= form_tag messages_path, method: "get" do %> 
<table class="table table-bordered"> 
    <thead> 
     <tr> 
     <th>Клиент</th> 
     <th>№</th> 
     <th>Дата</th> 
     <th>Послание</th> 
     <th>Тариф</th> 
     <th>Показ с</th> 
     <th>до</th> 
     <th>Стоимость, р.</th> 
     <th>Статус</th> 
     <% if current_user.admin? %> 
      <th>Модератор</th> 
     <% end %> 
     </tr> 
    </thead> 
    <tbody> 
     <tr> 
     <td><%= text_field_tag "client" %></td> 
     <td><%= text_field_tag "id", nil, size: 1 %></td> 
     <td></td> 
     <td><%= submit_tag "Выбрать" %><br><br><%= button_tag "Очистить" %></td> 
     <td><%= select_tag "tariff", options_for_select(["", "1. Вечер", "2. Весь день", "1001. ВЕЧЕР БЕСПЛАТНО", "1002. ДЕНЬ БЕСПЛАТНО"]), {} %></td> 
     <td></td>  
     <td></td> 
     <td></td> 
     <td><%= select_tag "status", options_for_select(["", "В обработке", "Исполняется", "Отклонена", "Выполнена"]), {} %></td> 
     <td></td> 
     </tr> 
     <%= render @messages %> 
    </tbody> 
    </table> 
    <% end %> 
</div> 
... 

Et maintenant, il fonctionne correctement.