Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails Ruby嵌套的IF语句语法_Ruby On Rails_Ruby - Fatal编程技术网

Ruby on rails Ruby嵌套的IF语句语法

Ruby on rails Ruby嵌套的IF语句语法,ruby-on-rails,ruby,Ruby On Rails,Ruby,我试图让这个嵌套的if语句工作,但我的语法错误,我无法理解它。我在Rails 4应用程序上有一个搜索框和一个排序下拉列表。在“搜索结果”页面上,我想根据用户在“排序”下拉列表中选择的内容对产品列表进行排序。如果用户没有输入搜索词,我希望显示一条消息。这是我的控制器代码 如果删除条件并仅显示默认排序,则搜索结果页面显示良好,因此错误出现在If语句语法中 def search if params[:search].present? if params[:sort] == "-

我试图让这个嵌套的if语句工作,但我的语法错误,我无法理解它。我在Rails 4应用程序上有一个搜索框和一个排序下拉列表。在“搜索结果”页面上,我想根据用户在“排序”下拉列表中选择的内容对产品列表进行排序。如果用户没有输入搜索词,我希望显示一条消息。这是我的控制器代码

如果删除条件并仅显示默认排序,则搜索结果页面显示良好,因此错误出现在If语句语法中

def search
    if params[:search].present?

      if params[:sort] == "- Price - Low to High"
        @listings = ...
      elsif params[:sort] == "- Price - High to Low"
        @listings = ...
      elsif params[:sort] == "- New Arrivals"
        @listings = ...
      elsif params[:sort] == "- Random Shuffle"
        @listings = ...
      else
        @listings = ...
      end

    else
      flash[:notice] = "Please enter one or more search terms e.g. blue shirt."
    end

  end

这里需要的是一个
case
语句,它是一个与其他语言(如JavaScript和C)的转换:

def search
  if params[:search].present?
    @listings =
      case (params[:sort])
      when  "- Price - Low to High"
        ...
      when "- Price - High to Low"
        ...
      when "- New Arrivals"
        ...
      when "- Random Shuffle"
        ...
      else
        ...
      end
  else
    flash[:notice] = "Please enter one or more search terms e.g. blue shirt."
  end
end
在Ruby中,
case
语句的结果可以用来赋值给变量,这样就消除了大量的
@listings=
重复。如果
,则
也是如此


你在这里比较的东西似乎异常具体。如果您有一个用于选择排序顺序的下拉列表,它们应该在内部使用更简洁的值,例如
plh
来表示“价格-从低到高”,甚至是数字代码。这意味着,如果措辞被更改,您的代码仍然有效。

我将更改您的下拉列表,使其具有类似于
价格asc
价格描述
到达日期asc
(不确定是否随机洗牌)的值,然后您可以使用

def search
  if params[:search].present?
    sort_listings(params[:sort])
  else
    flash[:notice] = "Please enter one or more search terms e.g. blue shirt."
  end
end

def sort_listings(sort)
  @listings ||= ...
  @listing.order(sort)
end

代码的确切行为是什么?是否始终显示通知?链接的
elsif
s太多。看起来您可以大量使用Ruby中的“switch”,它以
大小写的形式存在于
/
中:您正在检查:search是否存在,但随后“switch”打开:sort。这个行为正确吗?@D-side指出,这本质上是一个switch语句(在ruby中通常被认为是代码味道)。也许可以确定您要做什么,我们可以帮助您,因为您可能可以将其转换为1行或2行。@只有当用户单击“搜索”按钮而不输入搜索词时,才会显示“撤消”通知。这是一个基本的电子商务应用程序,用户在其中搜索要购买的产品。“排序”下拉列表位于“搜索结果”页面上。