2012-12-19 34 views
12

Ứng dụng đường ray (3.2.8) và turbolinks (không chắc chắn nếu có liên quan) được bật.Kỹ thuật Rails để thực thi javascript sau khi chuyển hướng

  1. Tôi có một số thông tin, link trên trang hiển thị của người dùng. (VD: Một thông báo rằng một cái gì đó đã thay đổi.)
  2. Khi người dùng nhấp vào liên kết Tôi muốn chỉ đạo ông trang
  3. Nhìn bề ngoài làm nổi bật các yếu tố làm thay đổi.

Hiện nay tôi đang lập kế hoạch để xử lý nó như thế này:

Tạo các liên kết để họ có dạng:

project2/comment.1453

Tạo một notifications controller, mà được các projects2 và loại thay đổi comment và id của nó 1453. Vì vậy, theo lý thuyết tôi muốn chuyển hướng đến projects2 và đánh dấu nhận xét có id 1453 trên trang đó. Vấn đề là: Sau khi chuyển hướng, làm cách nào để đánh dấu nhận xét?

notificationscontroller.rb (Pseudo mã!)

def show 
    project = Project.find(params[:project_id]) 
    comment = Comment.find(params[:commment_id]) 
    redirect_to project AND highlight! 
end 

Trong nghiên cứu của tôi, tôi đã đi qua Backbone, và có vẻ như xương sống router có thể giải quyết vấn đề này bằng cách trả lời các url với một chức năng (làm nổi bật của bình luận). Nhưng tôi không có kinh nghiệm với Backbone.

Tôi không chắc cách tiếp cận chung cho loại chức năng này là gì. Và muốn tránh đi xuống con đường sai lầm. Sẽ tuyệt vời nếu bạn có thể giúp tôi.

Chỉnh sửa: Sắp xếp một câu hỏi nhỏ: Tôi không chắc chắn ký tự nào để sử dụng cho comment.1453 là một lựa chọn tốt hơn? (comment#1453)

Trả lời

4

Bạn không thể chạy javascript sau khi chuyển hướng ngoài việc bao gồm javascript trên trang bạn chuyển hướng đến.

Điều bạn muốn là chuyển thông tin từ yêu cầu này sang yêu cầu tiếp theo (được chuyển hướng).

Đèn flash là một cách hay để thực hiện việc này. Thông thường you'ld sử dụng nó cho các tin nhắn văn bản:

redirect_to project, notice: "Project foo bar message" 

hoặc

flash[:notice] = "Project foo bar message" 
redirect_to project 

Không có gì mà dừng lại bạn từ việc sử dụng định danh khác trong flash và lưu trữ JSON trong của họ.

flash[:highlight_ids] = "[12, 43, 472, 482]" 
redirect_to project 

Sau đó, trong cách bố trí của bạn hoặc một nơi nào trích xuất tin nhắn nhấp nháy này để JavaScript:

var highlight_ids = <%= flash[:highlight_ids] %>; 

Sau đó làm kỳ diệu javascript của bạn để làm nổi bật các yếu tố thực tế.

+0

tôi cảm thấy như đây là một cách sạch hơn để lưu trữ các thông tin trong cookie, vì vậy tôi sẽ chấp nhận câu trả lời này. Cảm ơn – wpp

2

Một trong những cách có thể:

Store id (và có thể loại đối tượng nếu cần để làm nổi bật không chỉ bình luận) trong phiên giao dịch hoặc trực tiếp trong cookie (show hành động trong pseudo-code của bạn)

def show 
    project = Project.find(params[:project_id]) 
    comment = Comment.find(params[:commment_id]) 
    cookies[:highlight_id] = comment.id 
    cookies[:highlight_type] = 'Comment' # optionally 
    redirect_to project 
end 

trong điều khiển dự án show hành động

def show 
    ... 
    if cookies[:highlight_id] and cookies[:highlight_type] 
    @highlight_id = cookies[:highlight_id] 
    @highlight_type = cookies[:highlight_type] 
    cookies.delete[:highlight_id] 
    cookies.delete[:highlight_type] 
    end 

Và theo quan điểm bình luận

<div class="some_class <%= highlight(@comment, @highlight_id, @highlight_type %>" ... 

đâu highlight là một helper như

def highlight(object, object_id, object_type) 
    if object_id and object_type and object.is_a?(object_type.classify.constantize) 
    'highlighted' 
    end 
end 
Các vấn đề liên quan