我想允许用户和非登录访问者创建帖子,但在编码时遇到问题在 ruby on rails 教程中,我发现:
@post =current_user.posts.build(params[:post])
但 curren_user 将为零。另一种方法是
@post.user = current_user
这似乎没问题,但这条线太难看了吗?我是否需要创建一个来宾用户才能将这些帖子放入其中?
4 回答
@post =current_user.posts.build(params[:post], :user_id => current_user.id)
像这样使用
你可以这样做,假设你正在使用设计:
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
你可以通过多种方式做到这一点。关键是要有一个可以与帖子相关联的用户。为此,您可以从guest:boolean
在数据库中有列的用户模型开始,并为未经身份验证的用户使用该模型。然后,您将设置session[:user_id]
为新创建用户的 id,并将 guest 设置为 true,并让current_user()
应用程序控制器中的方法为您提供一个User
基于session[:user_id]
. 普通用户的工作方式相同,但将 guest 列设置为 false 的原因。
如果您对客人有更复杂的需求,您可以考虑使用单表继承 (STI) 并拥有一个User
基础模型,您可以将其子类化为Guest
和Member
. User 模型将保存共享逻辑,子类将保存其专用逻辑,但它们都将共享数据库中的一个表。
RailsCasts.com 上的 Ryan Bates 对此有两个截屏视频。去看看: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
角色.rb
class Role < ActiveRecord::Base
has_many :posts
has_many :users, :through => :posts
end
post.rb
class Post< ActiveRecord::Base
belongs_to :user
end
能力.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%>
<p><%= link_to "New Post", new_post_path %></p>
<% end %>
然后对于客人用户 -
user.posts.build(params[:post], :user_id => 0)
whereuser
使用 cancanability
类初始化,user_id
值可以是您为任何客人分配的任何固定值。在这个例子中,我假设:user_id => 0
它是一个访客条目。
对于已登录的用户 -
current_user.posts.build(params[:post], :user_id => current_user.id)
登录用户current_user
在哪里。devise
更多检查:康康。