0

我有一个简单的 Rails 应用程序,用户可以在其中创建“项目”,但在列出所有项目的主索引页面上,每个“项目”旁边都有“显示、编辑和删除”链接。我知道这是因为我使用脚手架来完成这些项目,但我想确保人们只能编辑他们创建的项目。目前,这种逻辑有点超出我的想象,就像我之前所说的那样,我对 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
4

3 回答 3

1

那里有很多东西。首先,为了能够根据用户过滤项目(或操作),您需要知道当时谁登录,从而使用户能够登录。例如,这可以使用Rails 的授权 gem Devise来完成。设计被广泛使用并有据可查。

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

editable_items = current_user.items

然后在您的视图上使用 editable_items。我建议您阅读设计教程,因为您正在做的是一项非常常见且有据可查的任务。

于 2013-02-26T07:00:39.193 回答
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 永远不受他们的直接控制——除非你的代码中存在重大漏洞——他们不能轻易地冒充其他用户。

于 2013-09-13T04:15:09.503 回答
0

我最终这样做了:

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

它起作用了……可以吗?

于 2013-03-03T01:28:41.730 回答