Rails - If / Else 在视图中返回两个分支
Rails - If / Else in view returning both branches
我的视图中有一个 'if / else' 运行,基于页面的当前 URL,当前视图显示的是 [=47] =] 既真又假。解释起来有点棘手,我不知道为什么会这样 - 任何解释/解决方案将不胜感激!
在代码之前,这里有一些背景知识:
- 我有食谱,每个食谱都有一个或多个菜系(通过 has-many-through 关系)
- 如果 URL 是,例如,/italian,我希望它显示所有菜谱 'Italian'
- 否则,如果 URL 无效或没有任何食谱与美食相匹配,我希望它显示一条消息,说明这一点
(到目前为止,这么简单吧?)
但是,当代码运行时,它会正确地打印正确的食谱(即法餐不会出现在 /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] })
不会匹配任何现有记录。
我显然可以提供更多关于我使用的代码和逻辑的解释。希望这对您有所帮助!
我的视图中有一个 'if / else' 运行,基于页面的当前 URL,当前视图显示的是 [=47] =] 既真又假。解释起来有点棘手,我不知道为什么会这样 - 任何解释/解决方案将不胜感激!
在代码之前,这里有一些背景知识:
- 我有食谱,每个食谱都有一个或多个菜系(通过 has-many-through 关系)
- 如果 URL 是,例如,/italian,我希望它显示所有菜谱 'Italian'
- 否则,如果 URL 无效或没有任何食谱与美食相匹配,我希望它显示一条消息,说明这一点
(到目前为止,这么简单吧?)
但是,当代码运行时,它会正确地打印正确的食谱(即法餐不会出现在 /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] })
不会匹配任何现有记录。
我显然可以提供更多关于我使用的代码和逻辑的解释。希望这对您有所帮助!