允许用户和非登录访客在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基础模型,您可以将其子类化为GuestMember 。 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_userdevise用户登录的。

如需更多检查: Cancan 。