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

时间:2015-02-12 20:32:23

标签: ruby-on-rails if-statement model-view-controller conditional-statements has-many-through

我已经' if / else'在我的视图中运行,基于页面的当前URL,并且当前视图显示应该是什么应该是' if'无论是真是假。解释起来有点棘手,我不知道为什么会这样 - 任何解释/解决方案都将不胜感激!

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

  • 我有食谱,每种食谱都有一种或多种美食(通过多种关系)
  • 如果网址是/例如/意大利语,我希望它能够显示所有食谱'意大利语'
  • 否则,如果网址无效或者没有匹配菜肴的食谱,我希望它显示一条说明此内容的消息

(到目前为止,这么直接吗?)

但是,当代码运行时,它正确打印正确的食谱(即法国餐不会出现在/意大利语网址上),但也会打印错误消息。这是代码:

在控制器中:

@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 %>

为了澄清,我已经测试了&#39; recipe_cuisine.name.downcase == @ url&#39;代码行,它应该在它应该是的时候返回true,如果它不应该是false。

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

先谢谢,史蒂夫。

修改

以下是影响此的路线:

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

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

您定义了以下路线:

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

这意味着当您点击/recipes时,它会使用cuisine控制器的recipes操作(感谢'recipes#cuisine')。 您还在:cuisine之后定义了额外的recipes/,这意味着如果您点击/recipes/italian,那么您的控制器/视图中将有一个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] })与任何现有记录都不匹配。


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