Ruby 使用rails验证确定视图
所以我把它放在心上了 我已经使用验证将许多检查(即创建新对象)从控制器转移到模型。有没有一种方法可以利用我现在从控制器获得的健壮的验证套件来确定应该在我的视图中显示什么?我在想:Ruby 使用rails验证确定视图,ruby,ruby-on-rails-3,validation,Ruby,Ruby On Rails 3,Validation,所以我把它放在心上了 我已经使用验证将许多检查(即创建新对象)从控制器转移到模型。有没有一种方法可以利用我现在从控制器获得的健壮的验证套件来确定应该在我的视图中显示什么?我在想: # in the controller @item = Item.new if valid? # then in the view: <% if @item %><%= #button to create new item %>... 控制器中的# @item=item.new是否有效? #
# in the controller
@item = Item.new if valid?
# then in the view:
<% if @item %><%= #button to create new item %>...
控制器中的#
@item=item.new是否有效?
#然后在视图中:
...
另一个用例:
<% if @comment.valid? %><div class="new comment"></div><% end %>
我需要为某些字段传递“虚拟”值以使验证通过,但我最关心的是“是否允许用户这样做”类型的内容。很抱歉问了一个哲学问题,但这里的最佳实践是什么
更新
下面是一个我拥有的权限验证示例。如果可能的话,我想保持干燥并使用它,而不是复制并粘贴到控制器上
class Comment < ActiveRecord::Base
belongs_to :user
belongs_to :commentable, :polymorphic => true
validate :user_can_comment, :if => :user
def user_can_comment
errors.add(:user, "can't comment") unless (user.is_photographer || user.id == commentable.user_id)
end
end
class注释true
验证:用户\u可以\u注释,:if=>:用户
def用户\u可以\u评论
错误。添加(:user,“不能评论”),除非(user.is| | | user.id==commentable.user|id)
结束
结束
看起来您在这里混为一谈。验证并不用于访问控制。有效用户可能有权也可能没有权访问应用程序的某些部分,不应首先创建无效用户。无效用户确实存在,但仅在呈现带有错误消息的表单期间存在。他们永远不会得救
验证
rails中最基本的脚手架控制器将向您展示控制器的外观
# Example of registration form
class UsersController < ApplicationController
def new
@user = User.new
end
def create
@user = User.new(params[:user])
if @user.save
redirect_to root_url, notice: 'Welcome!'
else
render :new
end
end
end
这将为您的所有控制器和视图提供一个名为
admin?
的方法,您可以使用该方法确定用户是否可以访问某些内容。更复杂的权限需要使用角色。Ryan Bates提供了一个很好的库,可以帮助您实现这一点。查看我的更新-我在验证方面也有“权限”。你是说那种东西不应该在模型里?在模特身上我感觉很对,不完全是这样。Rails验证不适用于权限。不要用它们来做那件事。它们旨在防止使用无效属性/关联创建或更新模型。您仍然可以使用简单的角色相关标志(如admin?
)对模型执行权限,但更好的做法是在控制器级别处理权限。模型只有一个角色
字段(或布尔标志或任何您想要的内容),用于确定其在其他地方的权限。以CanCan的工作方式为例。本质上,验证不是权限。我还没有完全加入,但我已经做了很多研究,你的方法肯定是目前公认的“最佳实践”,所以我会按答案打分。在验证中拥有我的权限是一种非常安全的感觉。你甚至暗示说,“……验证是为了防止模型被创建为具有无效关联……”——对我来说,一个用户评论他们不允许的内容是无效关联。不过我很喜欢CanCan的外观,所以我要试一试。无效数据和拒绝访问之间有很大区别。多想想。
class ApplicationController < ActionController::Base
# ...
helper_method :admin?
def admin?
current_user.present? && current_user.admin?
end
end