在轨道上的ruby中渲染带有类别的不同显示页面

我需要为我的博客post呈现不同的显示页面。

我有3个不同的类别:主题,片段,项目。

每篇博文都必须与这三个类别相关。

如果有人点击post(假设相关类别是片段),它会显示在不同的节目……等等……对于其他类别也是如此。

如何使用条件语句。

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

然后在控制器的show动作中。

 controllers/posts_controller.rb def show @post = Post.find(params[:id]) @category = params[:category] ... end 

然后在显示页面中呈现该类别。

意见/职位/ show.html.erb

 ... <%= render '#{@category}'%> 

只需一个show方法,你可以有条件地呈现不同的视图,简单的渲染适合你,你可以使用下面的代码:

如果文件位于同一控制器的视图中,则使用HTML文件名进行渲染

 if @post.theme? render 'themes' elsif @post.snippet? render 'snippets' else render 'projects' end 

我会从这开始,然后重构以避免重复

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 

你可以这样做:

车型/ 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}" %> ... 

如果您没有类别的任何公共部分,也可以从控制器渲染指定的模板

您可以使用rails partial来实现此目的:

了解更多关于部分参考Rails的更多信息

您可以按如下方式为类别创建部分:

应用程序/视图/类别/ _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'这将寻找部分内部类别视图。