如何阻止任何人提交表单?现在,任何用户都可以在任何其他用户的个人资料上更新表单,他们应该只能触摸他们的个人资料。
如果表单不在当前用户的个人资料中,或者在控制器内部做一些更安全的事情,我是否应该隐藏表单?
例如,我有一个表格来创建一本新书。实际上,表单应该显示的唯一时间是登录用户的个人资料页面。该表单应该隐藏在其他人的个人资料页面上。
形式:
<%= 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
答案 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