组织同一模型的两个不同视图的正确方法是什么?

ROR新手。 我读了很多,但我觉得我吸收很慢。 我正在尝试创建一个包含相同内容的两个不同视图的Web应用程序:

  1. 一个页面充满了艺术家的访问者按图像浏览(在网站的根目录)。
  2. 一个页面,其中列出了那些相同的艺术作品,并显示了我为它们定义的所有相关属性(媒体等),因此我可以查看与每个艺术作品相关的数据。 这应该是我的超轻量级管理页面。

我的问题是:

  1. 由于我是从脚手架生成这个网站,我目前正在使用views / artwork / index.html.erb作为管理表视图(应该是私有的),我创建了一个“主页”并添加了一些代码到’家庭’视图(和pages_controller)使艺术品出现在那里(为公众)。 我这样做了吗? 这是一种很好的组织方法吗?
  2. 我已经在登录后面的页面上安装了设计和成功隐藏链接以编辑艺术品,但我不知道封锁应用程序部分的正确方法(例如管理表页面,编辑页面等)剩下的世界。 我应该将这些页面放在不同的文件夹中吗? 如何将这些页面设为私有?

以下是一些片段:home.html.erb

艺术品/ index.html.erb:

  

Listing artworks

Image Title Genre Category Medium Date Dimensions Availability Rating Edit
x

pages_controller.rb和artworks_controller.rb都有这样的代码:

 def index if params[:tag] @artworks = Artwork.tagged_with(params[:tag]) else @artworks = Artwork.all end end 

pages_controller.rb:

 def home @artworks = Artwork.all end 

和routes.rb:

 get 'tagged' => 'artworks#index', :as => 'tagged' devise_for :users # get "artworks" => "artworks#index" # post "artworks" => "artworks#index" root "pages#home" get "about" => "pages#about" #get "users" => "users#index" resources :artworks 

在此先感谢您的耐心和帮助!

艺术品/ index.html.erb

 

您希望此页面在用户登录前保密。然后您可以尝试:

 <% if current_user.present? %> 
<% end %>

只有在用户登录时才会显示此div。对于尚未登录的用户,此页面将是私有的。

为了使编辑选项成为私有:

 <% if current_user.present? %> 
<% @artworks.each do |artwork| %>
<%= link_to image_tag(artwork.image.url(:medium)), artwork %>
<% end %>
<% end %>

在任何情况下,如果您想要公共/私有的几个部分,那么只需将其包装在视图的条件if语句中。

如果有人愿意,那么他可以直接点击url并直接进入你的行动,在这种情况下你可以把条件放在控制器中。

  before_action :authenticate_user!, only: [:action_1, :action_2] 

此外,如果您需要根据用户角色保密,您可以随时选择cancan gem。

这可能是正确的方法。 但是你已经安装了设计并隐藏了链接。 但是有人可以直接点击url。 您需要添加一些授权代码,这将使管理员只能编辑艺术作品。 这可以通过多种方式完成。 如果您有一个简单的应用程序,您只需添加一个前置filter,您可以在其中检查用户是否为管理员,然后只有他可以访问该页面并在编辑和更新操作时调用该页面。 如果需要许多角色,您也可以使用任何授权gem,如权限。 希望这可以帮助。

为了使代码DRY:

 before_filter :set_artworks, :only => [:home, :index] private def set_artworks @artworks = Artworks.all end 

维护权限的最简单方法是使用cancancan gem。

通过bundler安装它并通过rails generate cancan:ability模型rails generate cancan:ability 。 然后你必须区分管理员用户和其他人(例如你可以向用户模型添加整数“角色”)并在models/ability.rb#initialize写下这样的东西

 if user.admin? can :manage, :all else can :read, Artwork end 

并修改控制器,如下所示:

 def index authorize! :edit, Artwork if params[:tag] @artworks = Artwork.tagged_with(params[:tag]) else @artworks = Artwork.all end 

结束

如果管理员用户不想要索引,这将抛出exception。 您可以使用redirect_to通知用户该错误。 将其添加到ApplicationController:

 rescue_from CanCan::AccessDenied do |exception| redirect_to root_url, :alert => exception.message end