Rails应用程序中CRUD项目/微博的所有权

时间:2013-02-25 21:04:34

标签: ruby-on-rails ruby erb

我有一个简单的rails应用程序,用户可以在其中创建“项目”,但在列出所有项目的主索引页面上,每个“项目”旁边都有“显示,编辑和删除”链接。我知道这是因为我使用脚手架来完成这些项目,但我想确保人们只能编辑他们创建的项目。这个逻辑目前略高于我的头脑,就像我之前说过的那样,对于铁轨来说,我是一个全新的人。

用户控制器:

class UsersController < ApplicationController
  def show
    @user = User.find_by_username(params[:id])
  end
  def index
    @user = User.find(:all)
  end
end

主物品查看:

<div class="well">
  <h1>All Items</h1>
    <table>
  <tr>
    <th>Title</th>
    <th>Details</th>
    <th>Inquire</th>
    <th></th>
    <th></th>
    <th></th>
  </tr>
<% @items.each do |item| %>
  <tr>
    <td><%= link_to item.title, item_path(item) %></td>
    <td><%= item.content %></td>
    <td><%= mail_to item.email, "Inquire", :cc => "michaelomchenry@gmail.com",
                 :subject => "OverFlow Inquiry Regarding " + item.title %></td>
    <td><%= link_to 'Show', item %></td>
    <td><%= link_to 'Edit', edit_item_path(item) %></td>
    <td><%= link_to 'Destroy', item, confirm: 'Are you sure?', method: :delete %></td>
  </tr>
<% end %>
  </table>

<br />
<%= link_to 'New Item', new_item_path %>
</div>

物品型号:

class Item < ActiveRecord::Base
  attr_accessible :content, :user_id, :title
  validates :content, :length => { :maximum => 140 }
  belongs_to :user
  delegate :email, to: :user
end

3 个答案:

答案 0 :(得分:1)

那里有很多东西。首先,为了能够根据用户过滤项目(或操作),您需要知道当时登录的人员,从而使用户能够登录。这可以通过使用Devise(Rails的授权gem)来完成。设计在很大程度上被使用并且有很好的文档记录。

设置Devise后,您可以检查用户是否已记录(例如使用before_filter),并且Devise将创建一个“current_user”变量供您使用(显示在{{3}中) })。然后,您可以使用它来过滤项目列表,例如:

editable_items = current_user.items

然后在您的视图中使用editable_items。我建议你去阅读Devise教程,因为你正在做的是一个非常常见且记录良好的任务。

答案 1 :(得分:1)

如果可以的话,我会发表意见,但我觉得必须参考@momchenr发布的答案(回答他们自己的问题)作为所选答案的后续内容。

@momcher写道:

  

我最终这样做了:

<% if item.email == current_user.email %>
     

它有效......是吗?

可能不是。但这取决于系统的设置方式。如果用户可以编辑他们的电子邮件地址和/或电子邮件地址不是唯一的,他们可以通过临时更改他们的电子邮件地址或仅注册为新用户来获得对其他用户的“项目”的编辑访问权限。已知用户的电子邮件地址。

即使您从未在应用程序中显示用户的电子邮件地址,当您将大部分身份验证过程留在用户提供的字段中时,也存在一个固有的漏洞。

根据您提供的信息,不确切知道如何在Devise中设置内容 - 请尝试以下操作:

这两个可能是触摸较慢,具体取决于调用时的ActiveRecord状态

  • <% if item.user == current_user %>
  • <% if item.user.id == current_user.id %>

由于你没有从user对象中获取item对象(你只是直接从user_id方法中取出user,所以这个应该更快一点。对象)

  • <% if item.user_id == current_user.id %>

无论我在速度上的猜测是对还是错,这通常都是比你所说的更适合你的解决方案。由于用户的ID永远不会被他们直接控制 - 除非您的代码中存在重大漏洞 - 他们不能像其他用户那样容易构成。

答案 2 :(得分:0)

我最终这样做了:

<% if item.email == current_user.email %>

它有效......是吗?