在RubyOnRails

时间:2016-04-20 08:46:32

标签: ruby ruby-on-rails-4 if-statement search

我在构建嵌套的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语句。现在我想 检查params是否来自搜索,然后我想显示搜索结果 结果在索引中。我如何实现这一目标?请亲密,如果我的 问题不明确..

请帮助和 纠正我。 提前谢谢。

2 个答案:

答案 0 :(得分:0)

我认为解决这个问题的方法是提供一种可重用的方法来返回订单摘要和默认情况下的问题(不进行搜索),然后在基础结果的基础上应用搜索过滤器。为此,我将定义检索默认情况的方法,以便可以在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

答案 1 :(得分:0)

您可以分成两个控制器

似乎你试图通过同一个控制器返回两个不同的资源,这从来都不是一个好主意,也不是一个好习惯。我至少会拆分控制器动作并创建两个单独的路径。它更干净。

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

然后,您可以使用相同的视图模板来显示结果,如果这就是您最初在同一个控制器中执行所有操作的原因。但我建议将模板分开,重用部分中的公共部分。

您需要它在同一个控制器中

如果出于任何原因,绝对必须使用相同的控制器操作,例如,如果您的搜索栏有一个下拉列表,可让您选择要显示的结果类型,那么我将全部移动PORO中用来处理逻辑的逻辑,如下:

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

它更干净,让您可以更灵活地添加更多类型的元素进行搜索,只需添加一个以您正在搜索的类型命名的方法,它就会得到开箱即用的支持。