繁体   English   中英

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

[英]CRUD Ownership of Items/Microposts in Rails App

我有一个简单的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

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

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

editable_items = current_user.items

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

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

@momcher写道:

我最终这样做了:

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

它工作......那可以吗?

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

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

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

根据调用时ActiveRecord的状态,这两个可能会慢一些

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

这个应该更快,因为你没有从item对象获取user对象(你只是直接从user对象的user_id方法拉)

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

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

我最终这样做了:

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

它工作......那可以吗?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM