允许用户和非登录访客在rails中发帖
我想允许用户和非登录访问者创建post,但在编码时遇到麻烦在ruby on rails教程中,我发现: @post =current_user.posts.build(params[:post])
但是curren_user将是nil。 另一种方法是@post.user = current_user
这似乎没问题,但这条线太难看了吗? 我是否应该创建一个访客用户来将这些post放入其中?
你可以这样做,假设你正在使用设计:
application_controller.rb
class ApplicationController < ActionController::Base before_filter :set_current_user def set_current_user #create a new use if there is no logged in user #or you could probably load a default user current_user = User.new unless user_signed_in? end end
@post =current_user.posts.build(params[:post], :user_id => current_user.id)
像这样使用
你可以通过多种方式实现这一目标。 关键是让post可以与用户相关联。 要做到这一点,你可以从一个用户模型开始,该模型在数据库中有一个guest:boolean
列,对于未经过身份validation的用户也是如此。 然后,您可以将session[:user_id]
设置为guest虚拟机设置为true的新创建用户的id,并使应用程序控制器中的current_user()
方法为您提供基于session[:user_id]
的User
对象。 普通用户的工作方式相同,但将guest列设置为false。
如果您的访客有更复杂的需求,您可以查看使用单表inheritance(STI)并拥有一个User
基础模型,您可以将其子类化为Guest
和Member
。 User模型将保存共享逻辑,子类将保留其专用逻辑,但它们将共享数据库中的一个表。
Ryan Bates在RailsCasts.com上有两个截屏video。 去看看: 393 – 访客用户记录 (免费)和394 – STI和多态关联 (专业)。 他们详细详细地介绍了如何做到这一点,并谈论了每种方法的利弊。
您可以使用Devise和CanCan的组合将用户角色系统用于项目。
假设您有两个角色: guest和general_user。
然后在用户模型中定义 –
class User < ActiveRecord::Base // Devise stuff comes here.. //this is roles definition ROLES = %w[general_user guest] def role?(role) roles.include? role.to_s end end
role.rb
class Role < ActiveRecord::Base has_many :posts has_many :users, :through => :posts end
post.rb
class Post< ActiveRecord::Base belongs_to :user end
ability.rb(这是CanCan)
class Ability include CanCan::Ability def initialize(user) user ||= User.new #guest user if user.role? :general_user can :create, :all can :manage, :all can :read, :all end if user.role?(:guest) can :create, Post can :update, Post do |post| post.try(:user) == user end end end
文章/ index.html.erb
<% if can? :create, Post%> <%= link_to "New Post", new_post_path %>
<% end %>
然后为客人用户 -
user.posts.build(params[:post], :user_id => 0)
使用cancan ability
类初始化user
位置, user_id
值可以是您为任何来宾分配的任何固定值。 在这个例子中,我认为:user_id => 0
,然后是一个访客条目post。
并为登录用户 -
current_user.posts.build(params[:post], :user_id => current_user.id)
其中current_user
是devise
用户登录的。
如需更多检查: Cancan 。