2017-11-18 236 views
0

在我的項目我有一個用戶模式和廣告模式。用戶模型也包含管理員。我想設置路由,以便管理員登錄時,所有URL都包含「/ admin」。我是新來的鐵軌,並有相同的麻煩。例如,當普通用戶登錄時,url爲/ advertisements /:id/show,但是當管理員登錄時,URL將變爲/ admin/advertisements /:id/show。嘗試了很多方法,但找不到解決方案。 我的用戶遷移文件如下:軌添加/管理員路由時,管理員日誌中

class CreateUsers < ActiveRecord::Migration[5.1] 

def change create_table :users do |t| t.string :first_name, limit: 15, null: false t.string :last_name, limit: 15 t.string :username, limit: 20 t.string :email, null: false t.string :password_digest t.boolean :approved, default: false t.boolean :admin, default: false t.timestamps end end end

我的廣告遷移文件是:

class CreateAdvertisements < ActiveRecord::Migration[5.1] 
    def change 
    create_table :advertisements do |t| 
     t.string :name, null: false 
     t.text :description, null: false 
     t.integer :price, null: false 
     t.string :location, null: false 
     t.integer :user_id 
     t.boolean :approved, default: false 
     t.timestamps 
    end 
    add_index("advertisements", "user_id") 
    end 
end 

的路由文件(routes.rb中)具有代碼

resources: users 
resources: advertisements 

有沒有辦法做到這一點?

+0

你想不同的途徑導致單獨的控制器或你想同一個控制器能與不同的路線訪問? – AntonTkachov

+0

我希望可以通過單獨的路線訪問相同的控制器,例如廣告可能不得不由管理員或發佈它的用戶刪除。 –

+0

一方面是......但另一方面用戶應該只能訪問他自己的帖子,而管理員 - 所有帖子。我通常使用兩種變體:1.設置單獨的管理面板命名空間或2.使用相同的路由,但只隱藏沒有管理員用戶的管理員邏輯。你有什麼理由擁有2個管理員的2條路線?管理員/非管理員角色可以在一條路線上輕鬆處理 – AntonTkachov

回答

0

要定義這樣的路線,你可以你:

resources: advertisements 

scope :admin 
    resources: advertisements 
end 

然後建立某種過濾器,這將迫使用戶使用/advertisements鏈接和力管理員用戶/admin/advertisementsadvertisements_controller

before_action :require_proper_route_for_role, only: [:index, :new, :show, :edit] 

private 
def require_proper_route_for_role 
    request_params = "?#{params.to_query}" 
    if user.admin? && request.path !~ /^\/admin/ 
    redirect_to "/admin#{request.path}#{request_params}" 
    elsif request.path =~ /^\/admin/ && !user.admin? 
    redirect_to "#{request.path.sub('/admin','')}#{request_params}" 
    end 
end 

此代碼是不完美可言,但它是我能在有限的時間做最好...但是,正如我所說,我認爲你正在做一些錯誤的事情,應該在一般

重新思考
+0

感謝您的幫助。除了與URL一起發送參數的URL之外,其他工作都很精美。 –

+0

是的,你是對的。我沒有考慮到它。但是在create/update/destroy中處理所有這些將會非常困難。你不能做重定向POST/PUT/DELETE – AntonTkachov

+0

所以再次就是爲什麼你需要爲同樣的邏輯,不同路線的一個問題? – AntonTkachov

0

只是一個編輯,以「AntonTkachov的」的答案。代碼在某些部分失敗,因爲request.path丟棄了參數並剛剛獲得相對路徑,參數丟失。此外,'post','patch'和'put'方法正在變成阻止創建和更新新廣告的'get'方法。一些小的變化,讓我來糾正問題,如下:

before_action: :require_proper_route_for_role, except: [:create, :update] 

private 

def require_proper_route_for_role 
    url_path = request.url 
    params_path = url_path.split('?').last 
    if current_user.admin? && request.path !~ /^\/admin/ 
    if params_path == url_path 
     redirect_to "/admin#{request.path}" 
    else 
     redirect_to "/admin#{request.path}?#{params_path}" 
    end 
    elsif request.path =~ /^\/admin/ && !current_user.admin? 
    redirect_to "#{request.path.sub('/admin','')}" 
    end 
end