У меня проблемы с построением вложенных операторов if. У меня есть индексная страница, на которой я показываю записи, основанные на каком-то условии. Мой код контроллера для этого:

def index_orderSummary
  if Date.today.month>=4
    @order_summary = OrderSummary.where(:created_at=>("#{Time.now.year}-04-01")..("#{Time.now.year+1}-03-31"))
  else
    @order_summary = OrderSummary.where(:created_at=>("#{Time.now.year-1}-04-01")..("#{Time.now.year}-03-31"))
  end
  @order_summary = @order_summary.paginate(page: params[:page]).per_page(10).order("order_no ASC")
end

def index_issues
    @user = User.new
    @user = User.find(session[:user_id]).name
    if Date.today.month>=4
      @issue = Issue.where(:created_at=>("#{Time.now.year}-04-01")..("#{Time.now.year+1}-03-31"))
    else
      @issue = Issue.where(:created_at=>("#{Time.now.year-1}-04-01")..("#{Time.now.year}-03-31"))
    end
    @issue = @issue.paginate(page: params[:page], per_page: 10).order("issue_slip_no ASC")
  end

Я использовал поле поиска, для которого я написал следующий метод в контроллере.

def search
  if params[:id] == "search-order" then
    @order_summary = OrderSummary.where(:created_at=>("#{Time.now.year}-04-01")..("#{Time.now.year+1}-03-31")).search(params[:search])
    @order_summary = @order_summary.paginate(page: params[:page]).per_page(5).order('order_no ASC')
    render :action => :index_orderSummary
  elsif params[:id] == "search-issue" then
    @issue = Issue.where(:created_at=>("#{Time.now.year}-04-01")..("#{Time.now.year+1}-03-31")).search(params[:search])
    @issue = @issue.paginate(page: params[:page]).per_page(10).order("issue_slip_no ASC")
    render :action => :index_issues
  end
end

Теперь все, что мне нужно, - это интегрировать методы поиска и индексирования.

Мои методы индекса уже имеют оператор if else. Теперь я хочу проверить, поступают ли параметры из поиска, а затем я хочу отображать результаты поиска в индексе. Как мне этого добиться? Просьба интимного, если мой вопрос не ясен ..

Пожалуйста, помогите и поправьте меня. Заранее спасибо.

0
kelvin 20 Апр 2016 в 11:46

2 ответа

Лучший ответ

Я думаю, что способ сделать это - предоставить многоразовый способ вернуть сводные данные о заказах и проблемах в случае по умолчанию (без поиска), а затем применить фильтры поиска поверх базовых результатов. Для этого я бы определил методы для получения случаев по умолчанию, чтобы их можно было повторно использовать в различных разделах операторов if-else. Обычно, если у вас много вложенных операторов if, вы можете очистить их, создав методы. Это выглядело бы примерно так:

def index_orderSummary
  if params[:id] = "search-order"
    @order_summary = order_summary.search(params[:search])
      .paginate(page: params[:page]).per_page(5).order('order_no ASC')
  else
    @order_summary = order_summary
      .paginate(page: params[:page]).per_page(10).order("order_no ASC")
  end
end

def index_issues
  @user = User.find(session[:user_id]).name
  if params[:id] = "search-issue"
    @issue= issue.search(params[:search])
      .paginate(page: params[:page]).per_page(10).order("issue_slip_no ASC")
  else
      @issue = issue.paginate(page: params[:page], per_page: 10).order("issue_slip_no ASC")
  end
end

def order_summary
  if Date.today.month>=4
    return OrderSummary.where(:created_at=>("#{Time.now.year}-04-01")..("#{Time.now.year+1}-03-31"))
  else
    return OrderSummary.where(:created_at=>("#{Time.now.year-1}-04-01")..("#{Time.now.year}-03-31"))
  end
end

def issue
  if Date.today.month>=4
    return Issue.where(:created_at=>("#{Time.now.year}-04-01")..("#{Time.now.year+1}-03-31"))
  else
    return Issue.where(:created_at=>("#{Time.now.year-1}-04-01")..("#{Time.now.year}-03-31"))
  end
end
0
hypern 20 Апр 2016 в 15:47

Можно разделить на два контроллера

Похоже, вы пытаетесь вернуть два разных ресурса через один и тот же контроллер, что никогда не является хорошей идеей или хорошей практикой. Я бы хотя бы разделил действия контроллера и создал два отдельных маршрута. Это чище.

class OrderSummariesController < ApplicationController
  def index
    # your code for finding order summaries
  end
end

class IssuesController < ApplicationController
  def index
    # your code for finding issues
  end
end

Затем вы можете использовать тот же шаблон представления для отображения результатов, если изначально вы делали все в одном контроллере. Но я бы посоветовал также разделить шаблоны, повторно используя общие части по частям.

Он должен быть в одном контроллере

Если по какой-либо причине вам абсолютно необходимо использовать одно и то же действие контроллера, например, если в вашей панели поиска есть раскрывающийся список, который позволяет вам выбирать, какие результаты показывать, тогда я бы переместил всю эту логику в ПОРО для работы с логикой, например:

class SearchResultsFactory
  def self.search_for_type type, query, page
    self.send(type.underscore, query, page)
  end

  def self.search_order query, page
    # your code for finding order summaries
  end

  def self.search_issue query, page
    # your code for finding issues
  end
end

А затем в вашем контроллере вам просто нужно будет сделать:

def index
  @results = SearchResultsService.search_for_type(params[:id], params[:search], params[:page])
end

Он чище и дает вам больше гибкости, чтобы добавить больше типов элементов для поиска, просто добавьте метод, названный в честь типа, который вы ищете, и он будет поддерживаться из коробки.

0
Marc Lainez 20 Апр 2016 в 19:52