Routing resources for Rails에서 :id 매개변수의 이름 변경
동적 매개 변수 슬롯을 변경하는 방법을 둘러보았더니 정확한 작업을 수행하는 이 게시물을 발견했습니다.게시물은 https://thoughtbot.com/blog/rails-patch-change-the-name-of-the-id-parameter-in 입니다.
기본적으로 다음과 같은 경로를 사용하는 경우에는 다음과 같습니다.
map.resources :clients, :key => :client_name do |client|
client.resources :sites, :key => :name do |site|
site.resources :articles, :key => :title
end
end
이러한 경로는 다음 경로를 생성합니다.
/clients/:client_name
/clients/:client_name/sites/:name
/clients/:client_name/sites/:site_name/articles/:title
한 가지 해결책은 다음을 무시하는 것입니다.def to_param
모델에 있는 방법이지만 모델 자체에 손을 대지 않고 이것을 원합니다.
그러나 Rails 2.x의 경우이므로 Rails 3의 경우 어떻게 동일한 결과를 얻을 수 있습니까?
갱신하다
이 앱은 Mongoid를 사용하고 있습니다.AR 말고요.그래서, 보석 친화적인 것은 가짜로 사용될 수 없습니다.
레일 4 및 5
레일 4에서,:param
당신이 원하는 것을 정확히 수행하는 것처럼 보이는 옵션이 추가되었습니다.레일즈 3 코드를 레일즈 4 코드와 비교해 볼 수 있습니다.
세부 사항
이 기능을 사용자 환경에서 쉽게 구현할 수 있습니다.routes.rb
파일:
# config/routes.rb
resources :posts, param: :slug
# app/controllers/posts_controller.rb
# ...
@post = Post.find_by(slug: params[:slug])
# ...
레일 4 릴리스 현재 이 기능은 레일 가이드에 문서화되어 있습니다.
레일 3
불행하게도, 레일 3에서,:key
에 대한 선택권.resources
제거되었으므로 추가 옵션을 전달하는 것만으로 이러한 방식으로 작성된 경로의 이름을 더 이상 쉽게 변경할 수 없습니다.
세부 사항
지난 1년 동안 애플리케이션이 이미 원하는 방식으로 작동했다고 생각합니다. 하지만 저는 당신이 설명한 효과를 얻을 수 있는 방법으로 가겠습니다.routes.rb
그것은 단지 그것보다 조금 더 많은 일을 필요로 할 것입니다.to_param
방법.다음을 사용하여 정의된 경로에서 사용자 지정 매개 변수를 정의할 수 있습니다.scope
그리고.match
(또는 사촌들입니다.get
,put
,post
,그리고.delete
) 원하는 파라미터 이름을 Matcher에 입력하기만 하면 됩니다.
get 'clients/:client_name', :to => 'clients#show', :as => client
scope 'clients/:client_name' do
get 'sites/:name', :to => 'sites#show', :as => site
end
모든 경로를 수동으로 추가해야 합니다.resources
자동으로 생성되지만 원하는 것을 달성할 수 있습니다.또한 효과적으로 사용할 수 있습니다.:controller
에 대한 옵션.scope
및 추가scope
반복의 일부를 제거하기 위한 블록.
편집(2014년 5월 8일):정답에 레일 3과 4에 대한 정보가 모두 포함되어 있음을 더욱 명확히 합니다. 코드에 대한 링크를 업데이트하여 정확한 라인 번호와 커밋으로 이동하여 더 오랜 시간 동안 작동할 수 있도록 합니다.
EDIT(2014년 11월 16일):레일 4는 현재 레일의 최신 버전이기 때문에 이제 맨 위에 있어야 하며 관련 정보를 포함해야 합니다.
편집(2016년 8월 9일):솔루션이 레일 5에서 여전히 작동함을 반영하고 오래된 링크를 업데이트합니다.
레일 4에서 pass param 옵션을 선택하여 :id param을 변경합니다.를 들어 를들면입니다.resources :photos, param: :photo_name
//proxy/:photo_name 파일을합니다.
레일 3에서는 다음과 같은 네임스페이스와 스코프의 조합을 사용하여 ID 키의 이름을 바꿀 수 있습니다(그러나 그다지 좋지는 않습니다).
namespace :clients do
scope "/:client_name" do
namespace :sites do
scope "/:name" do
post "/:title" => "articles#create"
...
end
end
end
end
내가 당신을 올바르게 이해했다면 당신이 원하는 것은client_name
에 id
당신의 URL에, 맞죠?
이 작업을 수행하려면 다음 작업을 수행합니다.to_param
모형에 있는 방법입니다.여기에서 더 많은 정보를 얻을 수 있습니다.
모든 것에 보석이 있는 것처럼 그것을 위한 보석이 있습니다 ;)
저는 레일 3에서 이러한 행동에 FriendlyId를 사용해 왔습니다.
모델에 다음과 같은 코드를 추가해야 합니다.
class Client < ActiveRecord::Base
has_friendly_id :name
end
...호환 이름이할 수 . 를 다음과 같은 할 수 클라이언트에 URI 호환 이름이 없는 경우에는 슬러그를 사용할 수 있습니다.has_friendly_id :name, :use_slug => true
슬러그를 사용할 때는 데이터베이스에도 슬러그를 유지해야 합니다.
했듯이, 그고이언듯이여수, 사용있다습니할전히했급은미당신리를 할 수 .to_param
여기에 문서화된 대로 레일 3을 이용한 트릭.FriendlyId가 좀 더 다재다능하다고 생각합니다.
언급URL : https://stackoverflow.com/questions/6592038/change-the-name-of-the-id-parameter-in-routing-resources-for-rails
'programing' 카테고리의 다른 글
VueJS - Store.dispatch에서 VueChart JS가 업데이트되지 않습니다. (0) | 2023.06.18 |
---|---|
Firebase Auth를 사용할 때 앱이 충돌합니다. 이유: '기본 앱이 이미 구성되었습니다.' (0) | 2023.06.13 |
Unix/Linux에서 Windows 파일 시간을 두 번째로 변환 (0) | 2023.06.13 |
선택하면 UITableViewCell에서 높이 변경을 애니메이션화할 수 있습니까? (0) | 2023.06.13 |
Translate API를 사용하는 Python App Engine 앱에서 ImportError: No module name piclient.discovery라는 오류가 발생하는 이유는 무엇입니까? (0) | 2023.06.13 |