0

我想允许用户和非登录访问者创建帖子,但在编码时遇到问题在 ruby​​ on rails 教程中,我发现: @post =current_user.posts.build(params[:post]) 但 curren_user 将为零。另一种方法是 @post.user = current_user 这似乎没问题,但这条线太难看了吗?我是否需要创建一个来宾用户才能将这些帖子放入其中?

4

4 回答 4

0
@post =current_user.posts.build(params[:post], :user_id => current_user.id)

像这样使用

于 2013-01-28T07:41:19.300 回答
0

你可以这样做,假设你正在使用设计:

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
于 2013-01-28T08:07:31.530 回答
0

你可以通过多种方式做到这一点。关键是要有一个可以与帖子相关联的用户。为此,您可以从guest:boolean在数据库中有列的用户模型开始,并为未经身份验证的用户使用该模型。然后,您将设置session[:user_id]为新创建用户的 id,并将 guest 设置为 true,并让current_user()应用程序控制器中的方法为您提供一个User基于session[:user_id]. 普通用户的工作方式相同,但将 guest 列设置为 false 的原因。

如果您对客人有更复杂的需求,您可以考虑使用单表继承 (STI) 并拥有一个User基础模型,您可以将其子类化为GuestMember. User 模型将保存共享逻辑,子类将保存其专用逻辑,但它们都将共享数据库中的一个表。

RailsCasts.com 上的 Ryan Bates 对此有两个截屏视频。去看看:393 - 访客用户记录(免费)和394 - STI 和多态关联(专业版)。他们详细地详细介绍了如何做到这一点,并讨论了每种方法的优缺点。

于 2013-01-28T08:17:20.117 回答
0

您可以使用 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

更多检查:康康

于 2013-01-28T08:23:26.563 回答