Rails - If / Else 在视图中返回两个分支

Rails - If / Else in view returning both branches

我的视图中有一个 'if / else' 运行,基于页面的当前 URL,当前视图显示的是 [=47] =] 既真又假。解释起来有点棘手,我不知道为什么会这样 - 任何解释/解决方案将不胜感激!

在代码之前,这里有一些背景知识:

(到目前为止,这么简单吧?)

但是,当代码运行时,它会正确地打印正确的食谱(即法餐不会出现在 /italian url 上),但也会打印错误消息。这是代码:

在控制器中:

@url = request.path.split('/')[2] #returning 'italian', 'french', etc.

和视图:

<% Recipe.all.each do |recipe| %>
  <% recipe.cuisines.each do |recipe_cuisine| %>
    <% if recipe_cuisine.name.downcase == @url %> 
      <p><strong><%= recipe.name.humanize %></strong></p>
      <ul>
        <% recipe.ingredients.each do |recipe_ingredient| %>
          <li><%= recipe_ingredient.name %></li>
        <% end %>
      </ul>
      <p><%= recipe.method %></p>
    <% else %> 
      <p>You've reached an invalid page, please return to <#%= link_to 'the homepage', root_url %></p>
    <% end %>
  <% end %>
<% end %>

澄清一下,我测试了 'recipe_cuisine.name.downcase == @url' 行代码,它在应该返回 true 时返回 true,在不应该返回 false 时返回 false。

有谁知道如何解决这个问题?

提前致谢,史蒂夫。

编辑

以下是影响此的路由:

Rails.application.routes.draw do
  get 'recipes/:cuisine' => 'recipes#cuisine'
  resources :recipes
end

集合中有多少种美食?如果有两个,并且其中一个的名称等于@url,那么您将看到第一个分支,而任何不等于@url 的名称将显示第二个分支。您正在评估每种美食的 if 语句。

您定义了以下路由:

get 'recipes/:cuisine' => 'recipes#cuisine'

这意味着当您点击 /recipes 时,它会使用 recipes 控制器的 cuisine 动作(感谢 'recipes#cuisine')。 您还在 recipes/ 之后定义了一个额外的 :cuisine,这意味着如果您点击 /recipes/italian,那么您的 [=36] 中将有一个可用的 GET 参数(名为 cuisine) =].

以下是使用方法:

# recipes_controller.rb
def cuisine
  @recipes = Recipe.all # (use `Recipe.scoped` if using Rails' version < 4)
  if params[:cuisine].present?
    @recipes = @recipes.includes(:cuisines).where(cuisines: { name: params[:cuisine] })
  end
  # other stuff
end

# cuisine.html.erb (view)
<% @recipes.each do |recipe| %>
  <p><strong><%= recipe.name.humanize %></strong></p>
  <ul>
    <% recipe.ingredients.each do |recipe_ingredient| %>
      <li><%= recipe_ingredient.name %></li>
    <% end %>
  </ul>
  <p><%= recipe.method %></p>
<% end %>

但是这个逻辑有一个缺陷:如果我点击 /recipes/frenchAndMexicanPlease 怎么办? params[:cusine] 将等于 "frenchAndMexicanPlease",并且您的数据库没有任何这样命名的美食类型。在这种情况下,它根本不会显示任何食谱,因为查询 @recipes.includes(:cuisines).where(cuisines: { name: params[:cuisine] }) 不会匹配任何现有记录。


我显然可以提供更多关于我使用的代码和逻辑的解释。希望这对您有所帮助!