2016-11-11 12 views
0

モデルがありますユーザーには列の役割が含まれています。ロールでユーザーモデルのルートを置き換える方法

class CreateUsers < ActiveRecord::Migration[5.0] 
    def change 
    create_table :users do |t| 
     t.string :name 
     t.string :email 
     t.string :address 
     t.integer :role 
     t.timestamps 
    end 
    end 
end 

User.role = 1、役割が荷主User.roleアクションショー(プロファイル)用= 0

routes.rbを

resources :users 

とURLであれば役割はお店です:http://localhost:3000/users/1

私はそれを変更したい:ロール。たとえば、 http://localhost:3000/shops/1(User.role = 1の場合) または.../shippers/1(User.role = 0の場合)。

私はそれを行う方法がわかりません。私を助けてくださいpls、ありがとう!

+1

[条件に基づくルート]の可能な複製(http://stackoverflow.com/questions/11230130/rails-routes-based-on-condition) – Pavan

+0

http://bjedrocha.com/rails/2015/03/18/role-based-routing-in-rails /これを試してくださいこれがあなたを助けることができると思います –

答えて

0

あなただけのそのルートをマップする場合は、ユーザーの構造の下でショーコントローラとそのルートを処理している

match '/shops/1', to: 'users#show' 
match '/shippers/1', to: 'users#show' 

この方法を行うことができます。次に、/shops/1のhtmlは、views/users/showのままでなければなりません。これは、レールがページをレンダリングするコントローラと同じ名前のビューを探すためです。

[UPDATE]

次に、あなたのコントローラに、あなたがより良いモデルでenumを使用していると思います。まず、

<% if User.role == 1 %> 
    <%redirect_to show_user_path%> 
+0

上記の私の更新されたコメントを見てください^^^ –

1

を言うことができます。このように、あなたはUser.role属性(だけではなく整数)に実際の役割を割り当てることができます。

#app/models/user.rb 
class User < ActiveRecord::Base 
    enum role: [:shipper, :shop] 
end 

これはまだデータベースにintegerを維持しますが、ActiveRecordの中の役割に実際の名前を割り当てます。たとえば、user.shipper?user.shop?が表示されます。


私は解像度を見ることに興味があったので、私はオンラインで見て、thisを見つけました。

私は考えていたことを説明します。ユーザーの役割を検証し、それに応じてリダイレクトするためには、制約を使用する必要があります。このようにして、単一のルートヘルパーを使用して、その役割に応じて異なるルートにユーザーを送信させることができます。

this answerあたりのように、私のような何か試してみた:私はしたいと思うものを

# lib/role_constraint.rb 
class RoleConstraint 
    def initialize(*roles) 
    @roles = roles 
    @role = request.env['warden'].user.try(:role) 
    end 

    def matches?(request) 
    params = request.path_parameters 
    @roles.include?(@role) && @role == params[:role] 
    end 
end 


#config/routes.rb 
resources :users, path: "", except: :show do 
    get ":role/:id", action: :show, on: :collection, constraints: RoleConstraint.new([:shipper, :shop]) 
end 

これは正確ではありませんが、それはロールを持つユーザーによってのみアクセス可能である単一のルートを、作成する必要があります荷送人またはショップのいずれかになります。

+0

それは "初期化されていない定数RoleConstraint"ですか? –

+0

自動ロードパスにlibディレクトリを追加する必要がありますhttp://stackoverflow.com/a/19650564/1143732 –

関連する問題