搜索表单不会更新RoR中的表格

时间:2017-04-14 13:58:03

标签: ruby-on-rails ruby

我正在尝试为表格编写过滤器。这是代码:

... /模型/ 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

... /控制器/关切/ 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

... /控制器/ messages_controller.rb

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

... /视图/消息/ 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>
...

... /视图/消息/ _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>
...

过滤器仅在刷新页面后才有效。通过菜单返回页面是值得的 - 表单按钮不起作用,由F5更新 - 它的工作原理。为什么呢?

如果您告诉我如何在应用后在字段中保存选定的过滤器值,我将不胜感激。

1 个答案:

答案 0 :(得分:0)

我找到了我的主要问题的答案:它需要将整个表格包含在... / views / 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>
...

现在它正常工作。