Просмотр записей по месяцам / годам с помощью последней и следующей кнопки Rails 6 - PullRequest
0 голосов
/ 19 июня 2020

Я создаю функцию с двумя кнопками, которая позволяет мне передавать параметры кнопке, либо вычитая из текущего месяца, либо переходя к следующему месяцу. Теоретически это просто: вы нажимаете «Далее», и вы видите все записи, созданные за месяц, или вы щелкаете в прошлом месяце, и вы видите записи, которые были созданы в прошлом месяце. Проблема, с которой я столкнулся, заключается в том, что параметры будут отключены, когда я нажму кнопку «Далее». Как я могу перемещаться по месяцам / годам с помощью двух кнопок? Кажется, он не запоминает параметр для последнего события нажатия кнопки.

Журналы Rails

Started GET "/facility_directory/lnpp?previous_month=5&commit=Next&next_month=7" for 127.0.0.1

services_controller.rb

def facility_directory

if params.has_key?(:select) # select month/year form
  month = Date.new(params[:select][:year].to_i, params[:select][:month].to_i)
   @facility_records = @facility.facility_records.where(created_at: month.all_month).order(created_at: :desc)
 @year = params[:select][:year]
 @month = params[:select][:month]
 elsif params.has_key?(:previous_month) # last month navigation button
   previous_month = Date.new(Date.today.year, params[:previous_month].to_i)
   @facility_records = @facility.facility_records.where(created_at: previous_month.all_month).order(created_at: :desc)
elsif params.has_key?(:next_month)
next_month = Date.new(Date.today.year, params[:next_month].to_i)
@facility_records = @facility.facility_records.where(created_at: next_month.all_month).order(created_at: :asc)
else
  date = Date.today
  start_date = date.at_beginning_of_month
  end_date = date.at_end_of_month
 @facility_records = @facility.chart_records.order(created_at: :desc).where(created_at: start_date..end_date)
end

конец

каталог_оборудования. html .erb

<%= form_tag facility_directory_path(@facility), :method => :get, :class => "form" do %>

 <div>
  <%= select_month(Date.today, {:include_blank => true.....%>
  <%= select_year(Date.today, {:include_blank => true...%>
</div>
<%= submit_tag('Search') %>
<% end %>

Кнопки навигации в прошлом месяце и следующем месяце.

<%= form_tag facility_directory_path(@facility), method: :get, class: '' do %>
  <%= submit_tag 'Previous Month', class: 'button' %>
  <%= hidden_field_tag 'previous_month', @month.present? ? (@month.to_i - 1) : (Time.now.month - 1) %>
<%= submit_tag 'Next', class: 'button ui basic blue small' %>
<%= hidden_field_tag 'next_month', @month.present? ? (@month.to_i + 1) : (Time.now.month + 1) %>
<% end %>

1 Ответ

1 голос
/ 20 июня 2020

Похоже, вы также столкнетесь с проблемой, когда ваше представление будет отображать форму, в которой скрытое значение next_month будет 13, или предыдущее будет 0 - оба из которых будут недействительными. .

Вы также устанавливаете по умолчанию год и месяц logi c в представлении. Как правило, вам будет удобнее, если установка месяца и года выполняется в одном месте - в контроллере.

Переместите все лог c, включая то, как определить, что будет следующим / предыдущим, в контроллеру и сохраните простоту представления:

<%= form_tag facility_directory_path(@facility), method: :get, class: '' do %>
    <%= hidden_field_tag 'current_month', @month %>
    <%= hidden_field_tag 'current_year', @year %>

    <%= submit_tag 'Previous Month', class: 'button' %>
    <%= submit_tag 'Next', class: 'button ui basic blue small' %>
<% end %>

Эта форма в представлении теперь просто содержит текущее состояние (месяц и год), а также предыдущее и следующее. Нет расчета месяца или настройки по умолчанию.

Контроллер

Затем в вашем контроллере вы можете определить, если:

  • Не было ввода формы (по умолчанию использовать текущий месяц)
  • Была нажата кнопка поиска (использовались выпадающие список года и месяца)
  • Нажата следующая или предыдущая кнопки.

Значение нажатой кнопки передается контроллеру, поэтому, если будет нажата следующая или предыдущая кнопка, вы увидите, что params[:commit] будет равно либо «Предыдущий месяц», либо «Следующий». И у вас также будут params [: current_year] и params [: current_month].

Убедитесь, что ваш контроллер создает @year и @month по умолчанию в качестве текущего.

ниже должны охватывать все эти случаи.

if params[:commit] == "Previous Month" || params[:commit] == "Next"
    # Handle preview/next buttons
    now = Date.new(params[:current_year].to_i, params[:current_month].to_i, 1)
    if params[:commit] == "Previous Month"
        target_date = now - 1.month
    else
        target_date = now + 1.month
    end
elsif params.has_key?(:select)
    # Handle the select drop down
    target_date = Date.new(params[:select][:year].to_i, params[:select][:month].to_i)
else
    # Handle the default case - the first day of the current month
    target_date = Date.new(Date.today.year, Date.today.month, 1)
end

@year = target_date.year.to_i
@month = target_date.month.to_i

# You can now consolidate the Active Record query into one query which handles all cases
@facility_records = @facility.chart_records.order(created_at: :desc).where(created_at: target_date..target_date+1.month)

Используя этот подход, вы можете иметь один запрос Active Record, который работает во всех случаях.

Лучшее, что можно избежать в будущем, - это :

  1. Держите как можно больше logi c вне поля зрения
  2. Установите значения по умолчанию для действия в контроллере (или модели)
  3. Создайте свой
  4. Знайте, что вы можете прочитать значение нажатой кнопки.

Надеюсь, это поможет в настоящее время и в будущем.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...