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

时间:2017-04-22 11:05:23

标签: ruby-on-rails ruby conditional ruby-on-rails-5

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

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

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

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

如何使用条件语句。

5 个答案:

答案 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',这将查找部分内部类别视图。