0

ユーザーと非ログインの訪問者が投稿を作成できるようにしたいのですが、コーディングに問題があります Ruby on Rails チュートリアルでは、次 @post =current_user.posts.build(params[:post]) のことがわかりました。別のアプローチは、 @post.user = current_user これは問題ないようですが、この行は醜すぎますか? それらの投稿を入れるためにゲストユーザーを作成する必要がありますか?

4

4 に答える 4

0

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_userdevise

詳細については、 Cancanをご覧ください。

于 2013-01-28T08:23:26.563 に答える
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]、guest を true に設定して新しく作成したユーザーの ID を設定しcurrent_user()、アプリケーション コントローラーのメソッドで にUser基づくオブジェクトを取得しsession[:user_id]ます。通常のユーザーは同じように動作しますが、guest 列が原因で false に設定されます。

ゲストに対してより複雑なニーズがある場合は、単一テーブル継承 (STI) の使用を検討し、およびUserにサブクラス化する基本モデルを用意できます。User モデルは共有ロジックを保持し、サブクラスは特殊化されたロジックを保持しますが、それらはすべてデータベース内の 1 つのテーブルを共有します。GuestMember

RailsCasts.com の Ryan Bates は、まさにこれに関する 2 つのスクリーンキャストを公開しています。それらをチェックしてください: 393 - ゲスト ユーザー レコード(無料) および394 - STI およびポリモーフィック アソシエーション(プロ)。彼らはこれを行う方法を詳細に説明し、各アプローチの長所と短所についても多く話します.

于 2013-01-28T08:17:20.117 に答える