Rails - 任何人都可以添加项目。不好

时间:2012-12-31 02:23:02

标签: ruby-on-rails

如何阻止任何人提交表单?现在,任何用户都可以在任何其他用户的个人资料上更新表单,他们应该只能触摸他们的个人资料。

如果表单不在当前用户的个人资料中,或者在控制器内部做一些更安全的事情,我是否应该隐藏表单?

例如,我有一个表格来创建一本新书。实际上,表单应该显示的唯一时间是登录用户的个人资料页面。该表单应该隐藏在其他人的个人资料页面上。

形式:

<%= form_for @book do |f| %>
    <%= f.hidden_field :user_id, :value => @user.id %>
    <%= f.hidden_field :status, :value => "f" %>
    <%= f.text_field :title, :placeholder => "Title" %>
    <%= f.text_field :author, :placeholder => "Author" %>
    <%= f.submit 'Add Book', :value => "" %>
<% end %> 

修改

我开始使用CanCan,但仍无法限制在其他用户的个人资料上创建图书的访问权限。

我的新能力.rb:

class Ability
    include CanCan::Ability

    def initialize(user)
        can :read, :all
        can :create, Book
    end
end

在应用程序控制器中过滤之前:

class ApplicationController < ActionController::Base
  before_filter :current_user

  def current_user
    User.current = current_user
  end
end

2 个答案:

答案 0 :(得分:2)

隐藏表单,并将user_id作为字段删除。在控制器中,如果用户有多个/一本书,那么利用该关联:

def create
   @book = current_user.books.new(params[:book])
   ...
end

如果由于某种原因意外地显示了该表单,则当前用户只能添加自己的图书。

答案 1 :(得分:1)

您正在寻找授权方案。控制器逻辑是重要的部分(实际上允许或不允许操作),但视图是用户看到的,因此您应该实现这两者。

虽然你可以自己动手,CanCan是一种相对轻松的方式。

CanCan可以轻松实现视图逻辑(您仍然必须这样做),如下所示:

<% if can? :create, Book %>
<%= render '/books/form'%>
<% end %>

宝石创作者Ryan Bates也是RailsCasts的创造者。方便的是,有一个covers CanCan

对于您的用例,我将定义一个这样的能力:

can :create, Book do |book|
  book.user = User.current
end

您需要在Application Controller中添加before_filter,以将当前用户放入User.current变量中,以使其工作(访问模型中的当前用户)。并将这两种方法添加到User模型中:

  def self.current
    Thread.current[:user]
  end
  def self.current=(user)
    Thread.current[:user] = user
  end