我需要为我的博客帖子呈现不同的显示页面。
我有3个不同的类别:主题,片段,项目。
每篇博文都必须与这三个类别相关。
如果有人点击帖子(假设相关类别是片段),它会显示在不同的节目......等等......对于其他类别也是如此。
如何使用条件语句。
答案 0 :(得分:2)
you can make routes like:
resources :posts, except:[:show]
get 'posts/:id/cat/:category' , to:'posts#show', as: :show
您必须按如下方式为类别创建部分:
应用程序/视图/帖/ _themes.html.erb
应用程序/视图/帖/ _snippets.html.erb
应用程序/视图/帖/ _projects.html.erb
然后在控制器的节目动作中。
controllers/posts_controller.rb
def show
@post = Post.find(params[:id])
@category = params[:category]
...
end
然后在显示页面中渲染该类别。
视图/帖/ show.html.erb
...
<%= render '#{@category}'%>
答案 1 :(得分:1)
只需一个show方法,您可以有条件地呈现不同的视图,简单的渲染适合您,您可以使用下面的代码:
如果文件位于同一控制器的视图中,则使用HTML文件名进行渲染
if @post.theme?
render 'themes'
elsif @post.snippet?
render 'snippets'
else
render 'projects'
end
答案 2 :(得分:0)
我会从这开始,然后重构以避免重复
categories_controller.rb
def themes
#@posts = Post.where(category_id: 1)
...
render layout: themes
end
def snippets
#@posts = Post.where(category_id: 2)
...
render layout: snippets
end
def projects
#@posts = Post.where(category_id: 3)
...
render layout: snippets
end
答案 3 :(得分:0)
您可以这样做:
模型/ post.rb
def category
@category ||= ... #returns category name
end
控制器/ post_controller.rb
def show
@post = Post.find(id)
@category = @post.category
...
end
视图/帖/ show.html.erb
...
<%= render "types/#{@category}" %>
...
如果您没有类别
的任何公共部分,也可以从控制器渲染指定的模板答案 4 :(得分:0)
您可以使用rails partial来实现此目的:
了解有关部分推荐的更多信息Rails Partial
您可以按如下方式为类别创建部分:
应用程序/视图/类别/ _themes.html.erb
应用程序/视图/类别/ _snippets.html.erb
应用程序/视图/类别/ _projects.html.erb
在类别的显示页面中,您可以按如下方式修改节目页面
class CategoriesController < ApplicationController
...
def show
...
render params[:category]
end
...
end
现在,当您调用show page时,会传递一个param类别,该类别表示您要显示的类别类型
如果你想显示类别片段,那么参数将是params [:category] ='snippets',这将查找部分内部类别视图。