2012-12-19 22 views
6

Vì vậy, tôi đã nhìn thấy rất nhiều cuộc thảo luận về SO về việc sử dụng erb trong các tệp CSS của bạn. Tôi có thể nhận được ERB để xử lý các tệp CSS bằng cách sử dụng cú pháp <% =%> và thêm .erb vào tệp, nhưng những gì tôi thực sự cần là truy cập các biến mẫu trong bộ điều khiển.Truy cập Rails Controller instance variables trong CSS

searches_controller.rb

def new 
    @search = Search.new 
    @school = School.find(params[:school]) 
end 

Những gì tôi thực sự muốn làm là:

searches.css.scss.erb

h1.logo { 
    color: <%= @school.primary_color %>; 
} 

nhưng ERB sẽ ném một lỗi vì @school là không. Có cách nào để yêu cầu bộ điều khiển truy cập các biến mẫu đó không?

Cách duy nhất khác tôi có thể nghĩ là làm điều đó là nhúng nó làm thuộc tính dữ liệu trong các khung nhìn và sau đó sử dụng JS để thay đổi nó trên giao diện người dùng. Điều này khiến tôi có khả năng tốt hơn vì tệp CSS sẽ không thay đổi và cần được gửi lại mỗi lần, nhưng nó cũng sẽ kém thanh lịch hơn nhiều.

Trả lời

9

Bạn cũng cần phải xem xét rằng trong một kịch bản tài sản được biên dịch trước, CSS sẽ được chạy qua Sprockets trong quá trình biên dịch, vì vậy bạn sẽ kết thúc với màu tĩnh (giả sử @school đã thực sự khởi tạo). Điều này là không mong muốn vì mỗi trường sẽ có cùng một màu (bất kỳ điều gì xảy ra trong giai đoạn biên soạn).

Đối với xây dựng thương hiệu tùy chỉnh như thế này, chúng tôi cho phép người dùng của chúng tôi xác định màu sắc của họ, và bao gồm một khối CSS trong cách bố trí:

:css 
    h1.logo { 
     color: <%= @school.primary_color %>; 
    } 

Nó không phải là lý tưởng, nhưng nếu bạn có một số ít các tùy biến dường như để làm việc khá tốt.

+0

Cảm ơn. Tôi đã hy vọng để đối phó với nó bên ngoài quan điểm, nhưng có vẻ như đây là con đường để đi. – rurabe

+0

Bạn có thể vui lòng cung cấp thêm chi tiết về cách thêm khối css vào bố cục ...? Tôi muốn trao đổi hình ảnh dựa trên kích thước màn hình và cần một cách cho các truy vấn phương tiện truyền thông của tôi để xem các biến cá thể của tôi. – brntsllvn

2

Tôi muốn sử dụng số @school.primary_color trong chế độ xem của bạn. Điều này sẽ hoạt động:

<h1 style="color:#{@school.primary_color}">@school.name</h1> 

Chỉ cần nhớ sử dụng dấu ngoặc kép cho nội suy.

+0

Tôi cố gắng chăm sóc nil càng sớm càng tốt. Vì vậy, trong trường hợp này, khung nhìn sẽ không bao giờ được cho ăn một đối tượng 'nil'. Nhưng nếu đó là một mối quan tâm thì toàn bộ khung cảnh nên thực sự được bao bọc trong một điều kiện. Nó không cụ thể cho việc sử dụng này. – mehulkar

+0

Chỉ có vấn đề với điều này là nếu bạn phải sử dụng màu đó ở nhiều nơi trong nhiều chế độ xem, bạn kết thúc bằng một số mã không thể duy trì được. –

+0

Đó là một điểm tốt. Tùy thuộc vào số lượng trường học, nó thậm chí có thể là một ý tưởng tốt để xác định hằng số trong các tệp CSS cho mỗi trường thay vì trong db. – mehulkar