Sử dụng Rails URL Helpers trong Javascript với JsRoutes
Bài đăng này đã không được cập nhật trong 7 năm
Giới thiệu
Khi chúng ta muốn sử dụng resource routing của Rails (ví dụ: "/blogs/new" hoặc "/blogs/2/edit", ...), chúng ta thường sử dụng path như new_blogs_path
, blog_path(id)
.
Nhưng khi chúng ta làm việc với javascript, thì sẽ không sử dụng các path như trong rails được, vậy thay vì sử dụng path route của rails, chúng ta sử dụng path bình thường như "/blogs/new" hoặc "/blogs/2/edit", .... Viết như vậy thì làm cho chúng ta rất khó khăn và không tốt cho lắm.
Trong bài này, mình sẽ giới thiệu gem js-routes
để giải quyết vấn đề trên.
Cài Đặt
Add gem vào trong Gemfile: gem "js-routes"
Sau đó chạy: bundle install
Sau đó: add require
vào trong application.js
//= require js-routes
Nếu JsRoute không load lại trong javascript hoặc không chạy đươc, bạn phải clear asset pipeline cache:
rake tmp:cache:clear
Usage
Basic
Trong route file: config/routes.rb
:
resources :posts
Trong javascript, bạn sẽ có thể viết routes như route path ở trong rails bình thường như sau:
Controller#Action | JsRoutes function callColumn |
---|---|
posts#index | Routes.posts_path() |
posts#new | Routes.new_post_path() |
posts#create | Routes.posts_path() |
posts#show | Routes.post_path(id) |
posts#edit | Routes.edit_post_path(id) |
posts#update | Routes.post_path(id) |
posts#destroy | Routes.post_path(id) |
posts#destroy | Routes.post_path(id) |
Nested Routes
Chúng ta có routes như sau:
resources :posts do
resources :comments
end
Trong javascript cũng viết tương tự như trong rails:
Controller#Action | JsRoutes function callColumn |
---|---|
comments#index | Routes.posts_path() |
comments#new | Routes.new_post_comment_path(post_id) |
comments#create | Routes.post_comments_path(post_id) |
comments#show | Routes.post_comment_path(post_id, comment_id) |
comments#edit | Routes.edit_post_comment_path(post_id, comment_id) |
comments#update | Routes.post_comment_path(post_id) |
comments#destroy | Routes.post_path(id) |
The Magic of “to_param”
Trong trường hợp, bạn muốn sử dụng path có params như: /posts/awesome_gem, thì bạn có thể dùng to_param
như sau:
var path = Routes.post_path({to_param: "jsroutes_is_awesome"});
Kết quả: /posts/jsroutes_is_awesome
Bây giờ, chúng ta sẽ xem xét các ví dụ dưới đây:
// vào một file javascript nào đó và viết như sau:
Routes.users_path() // => "/users"
Routes.user_path(1) // => "/users/1"
Routes.user_path(1, {format: 'json'}) // => "/users/1.json"
Routes.user_path(1, {anchor: 'profile'}) // => "/users/1#profile"
Routes.new_user_project_path(1, {format: 'json'}) // => "/users/1/projects/new.json"
Routes.user_project_path(1,2, {q: 'hello', custom: true}) // => "/users/1/projects/2?q=hello&custom=true"
Routes.user_project_path(1,2, {hello: ['world', 'mars']}) // => "/users/1/projects/2?hello%5B%5D=world&hello%5B%5D=mars"
// Sử dụng serialized object làm route
var google = {id: 1, name: "Google"};
Routes.company_path(google) // => "/companies/1"
var google = {id: 1, name: "Google", to_param: "google"};
Routes.company_path(google) // => "/companies/google"
Routes.post_path({to_param: "jsroutes_is_awesome"}); ///posts/jsroutes_is_awesome
Để chi tiết về cách sử dụng cũng như cách config
khác, bạn có thể tham khoả thêm ở đây:
https://github.com/railsware/js-routes
https://www.sitepoint.com/rails-url-helpers-javascript-jsroutes/
All rights reserved