ユーザーと非ログインの訪問者が投稿を作成できるようにしたいのですが、コーディングに問題があります Ruby on Rails チュートリアルでは、次
@post =current_user.posts.build(params[:post])
のことがわかりました。別のアプローチは、
@post.user = current_user
これは問題ないようですが、この行は醜すぎますか? それらの投稿を入れるためにゲストユーザーを作成する必要がありますか?
4 に答える
DeviseとCanCanの組み合わせを使用して、ユーザーロールシステムをプロジェクトに使用できます。
guestとgeneral_userの2つの役割があるとします。
次に、ユーザーモデルで定義します-
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
posts / 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)
ここで、user
はcancanability
クラスを使用して初期化され、user_id
値は任意のゲストに割り当てる固定のものであれば何でもかまいません。この例では:user_id => 0
、ゲストエントリの投稿を想定しています。
ログインしたユーザーの場合-
current_user.posts.build(params[:post], :user_id => current_user.id)
ログインしているユーザーcurrent_user
。devise
詳細については、 Cancanをご覧ください。
@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]
、guest を true に設定して新しく作成したユーザーの ID を設定しcurrent_user()
、アプリケーション コントローラーのメソッドで にUser
基づくオブジェクトを取得しsession[:user_id]
ます。通常のユーザーは同じように動作しますが、guest 列が原因で false に設定されます。
ゲストに対してより複雑なニーズがある場合は、単一テーブル継承 (STI) の使用を検討し、およびUser
にサブクラス化する基本モデルを用意できます。User モデルは共有ロジックを保持し、サブクラスは特殊化されたロジックを保持しますが、それらはすべてデータベース内の 1 つのテーブルを共有します。Guest
Member
RailsCasts.com の Ryan Bates は、まさにこれに関する 2 つのスクリーンキャストを公開しています。それらをチェックしてください: 393 - ゲスト ユーザー レコード(無料) および394 - STI およびポリモーフィック アソシエーション(プロ)。彼らはこれを行う方法を詳細に説明し、各アプローチの長所と短所についても多く話します.