2009-08-24 5 views
6

trong đơn đăng ký của tôi, tôi có mô hình "Người dùng". Mỗi người dùng có thể có nhiều địa chỉ (email) được định nghĩa trong mô hình "Địa chỉ":Một bộ điều khiển, các chế độ xem khác nhau cho người dùng và quản trị viên thông thường

Class User < ActiveRecord::Base 
    has_many :addresses 


    def is_authorized(op) 
    # returns true or false 
    end 

    def is_owned_by(user) 
    # returns true or false 
    end 
end 

Class Address < ActiveRecord::Base 
    belongs_to :user 
end 

Bên trong lớp AddressController, hiện đang đăng nhập người dùng có sẵn trong "@user" biến ví dụ. Bộ điều khiển ngăn người dùng thông thường chỉnh sửa, xóa, xem các địa chỉ vv không thuộc về họ - nhưng anh ta cho phép người dùng quản trị chỉnh sửa chúng. Lớp AddressController có thể hỏi AddressModel nếu người dùng hiện đang đăng nhập đang thực hiện các hoạt động bình thường hoặc superuser.

Điều này tất cả hoạt động độc đáo và cập nhật cơ sở dữ liệu được thực hiện như mong đợi, tuy nhiên, tôi thực sự muốn có chế độ xem HTML khác nhau tùy thuộc vào phương thức hoạt động. Tôi chỉ có thể nghĩ đến hai cách để đạt được điều đó:

  1. Tận dụng phương thức hoạt động (bình thường/đặc quyền) nổi tiếng trong lớp AddressController (sử dụng một biến Ví dụ, ví dụ @privileged) và sử dụng một "nếu" tuyên bố trong chế độ xem.
  2. Sử dụng thứ gì đó như "after_filter" trong bộ điều khiển địa chỉ để hiển thị bố cục khác.

Nếu có thể hiển thị kết quả thực hiện một bộ điều khiển trong hai bố cục hoàn toàn khác nhau, tùy thuộc vào chế độ hoạt động, cách tốt nhất để đạt được điều đó là gì?

Cảm ơn trước Stefan

Trả lời

9

Bạn có thể chỉ định chế độ xem nào sẽ sử dụng để hiển thị kết quả của một hành động trong chính hành động đó. Bạn cũng có thể chỉ định bố cục để sử dụng. Vì vậy, ví dụ:

def my_action 
    if @user.is_authorised(...) 
    render :action => 'admin_action', :layout => 'admin' 
    else 
    render :action => 'non_admin_action', :layout => 'non_admin' 
    end 
end 

Điều này sẽ làm cho một trong hai admin_action.html.erb hoặc non_admin_action.html.erb tùy thuộc vào giá trị trả về từ is_authorised. Tùy chọn :layout là, er, tùy chọn và tham chiếu bố cục trong chế độ xem/bố cục. Có nhiều tùy chọn khác mà cuộc gọi kết xuất mà bạn có thể tìm thấy trong số documentation for render.

+0

Cảm ơn bạn. Nhưng có vẻ như nếu tôi làm điều này, tôi sẽ rời khỏi con đường "quy ước về cấu hình". Tôi hơi lo lắng - đây là ứng dụng Rails đầu tiên của tôi - liệu tôi có nên phân kỳ từ những gì mọi người khác dường như làm không? – cite

+0

Vâng, được cho là quy ước để hiển thị một chế độ xem cho một hành động, nhưng tôi có thể thấy những gì bạn đang nhận được. Nếu bạn chỉ tìm kiếm các bố trí khác nhau thì giải pháp của Staelen là một giải pháp tốt. Nếu bạn thực sự muốn hiển thị các khung nhìn khác nhau tùy thuộc vào logic trong hành động thì tôi không chắc chắn nó đủ gần với quy ước cơ bản để tránh xa việc không chỉ rõ khung nhìn nào bạn muốn render. – Shadwell

+0

Tôi nghĩ rằng tôi sẽ cố gắng giải pháp của Staelen cho bố trí và một của bạn cho các mẫu được trả lại. Cảm ơn một lần nữa. – cite

3

Bạn chỉ có thể gọi phương thức render bằng tay ở phần cuối của hành động điều khiển của bạn:

if @privileged 
    render :action => 'show_privileged' 
else 
    render :action => 'show' 
end 

Điều này sẽ làm cho app/views/myview/show_privileged.html.erb hoặc app/views/myview/show.html.erb. Ngoài ra, bạn có thể sử dụng tùy chọn :template để cung cấp tệp mẫu rõ ràng cho phương thức hiển thị.

+0

Cảm ơn bạn, Dave. – cite

6

Bạn có thể chỉ định cách bố trí của quan điểm cho rằng điều khiển cụ thể, hoặc toàn bộ ứng dụng trong điều khiển ứng dụng bằng cách:

class SomeController < ApplicationController 
    layout :set_layout 

    def set_layout 
    @user.is_authorized(...) ? "privileged_layout" : "normal_layout" 
    end 

    ... 
end 

Bạn có thể thử tìm nó ra ở đây: http://guides.rubyonrails.org/layouts_and_rendering.html#using-render, dưới 2.2.12 tìm Layouts

Hope this helps =)

+0

Ồ, đây là một ý tưởng hay. Cảm ơn nhiều! – cite

2

Nếu đây là bộ điều khiển chỉ trong ứng dụng của bạn, nơi bạn nếu/else'ing khắp nơi đó có thể là tốt. Nếu bạn bắt đầu thực hiện loại logic này ở mọi nơi nên cho bạn biết rằng bạn đang làm quá nhiều cùng một lúc.

Câu trả lời bạn chấp nhận (có tác dụng và hoạt động!) Có bố cục khác và một chế độ xem khác, với tôi cho biết bộ điều khiển đang hoạt động quá nhiều - tôi sẽ tách phần này thành bộ điều khiển quản trị.

+0

Điều này. Bạn đa đung. Tôi đã cố gắng làm quá nhiều thứ cùng một lúc - ý tưởng của việc có tất cả những hành động đó có sẵn trong hai chế độ hoạt động là quá hấp dẫn. Tôi đã viết một bộ điều khiển quản trị chuyên dụng. Cảm ơn. – cite

0

Bạn nên đặt hành động quản trị trong không gian tên quản trị và hạn chế ở đó. Tạo một thư mục gọi admin trong thư mục bộ điều khiển của bạn và thêm một _application_controller.rb_ trong đó:

class Admin::ApplicationController < ApplicationController 
    before_filter :check_authorized 

    private 
    def check_authorized? 
     if !logged_in? || !current_user.admin? 
     flash[:notice] = "You've been very bad. Go away. 
     redirect_to root_path 
     end 
    end 
end 

Bây giờ bạn có thể đặt bộ điều khiển vào không gian tên này và làm cho họ kế thừa từ Admin::ApplicationController quá.