У меня есть blogs_controller с ресурсом Блога, таким образом, у меня есть Ваши типичные маршруты прямо сейчас следующим образом:
/blogs/new
/blogs/1
/blogs/1/edit #etc
Но вот то, что я хочу:
/blogs/new
/blogs/2010/01/08/1-to_param-or-something
/blogs/2010/01/08/1-to_param-or-something/edit #etc
...
/blogs/2010/01 # all posts for January 2010, but how to specify custom action?
Я знаю, что могу сделать это с комбинацией map.resources и map.connect, но у меня есть много представлений, которые связываются с другими страницами через "new_blog_path" и т.д., и я не хочу должным быть идти и редактировать их. Действительно ли это возможно с одним только map.resources? Это не могло бы быть легко, но я не против того, чтобы быть умным. Я думал о чем-то как:
map.resources :blogs, :path_prefix => ':year/:month/:day', :requirements => {:year => /\d{4}/, :month => /\d{1,2}/, :day => /\d{1,2}/}
Но я не уверен, как это работает с действиями как 'новый', или 'создайте', и это также дает мне маршрут как /2010/01/08/blogs/1-to_param-etc
с блогами посреди URL.
Так, есть ли умное решение, которое я пропускаю, или я должен пойти map.connect путем?
Я недавно столкнулся с той же проблемой, и, хотя это может быть не то, что вы ищете, это то, что я сделал, чтобы позаботиться об этом:
CONFIG / BURTS.RB :
map.entry_permalink 'blog/:year/:month/:day/:slug',
:controller => 'blog_entries',
:action => 'show',
:year => /(19|20)\d{2}/,
:month => /[01]?\d/,
:day => /[0-3]?\d/
blog_entries_controller.rb:
def show
@blog_entry = BlogEntry.find_by_permalink(params[:slug])
end
blog_entries_helper.rb:
def entry_permalink(e)
d = e.created_at
entry_permalink_path :year => d.year, :month => d.month, :day => d.day, :slug => e.permalink
end
_entry.html.erb:
<h2><%= link_to(entry.title, entry_permalink(entry)) %></h2>
и ради полноты:
BLOG_ENTRY.RB:
before_save :create_permalink
#...
private
def create_permalink
self.permalink = title.to_url
end
Метод #to_URL поставляется из RSL Stringex .
Я все еще новичок в рельсы (и программирование) сам, но это, наверное, самый простой способ пойти об этом. Это не является спокойным способом идти о вещах, чтобы вы не получили преимущества Cap.Resources, к сожалению.
Я не уверен (потому что я не пробовал), но вы сможете создать соответствующие помощники в Application_Helper.rb
, чтобы переопределить помощники маршрута по умолчанию для Blog_Path, et al. Если это работает, то вам не нужно менять какой-либо из вашего кода просмотра.
Если вы чувствуете авантюристы, вы можете проверить фильтр маршрутизации . Я рассмотрел его, но это похоже на избиение для этой задачи.
Кроме того, если вы не знаете, две вещи, которые вы можете сделать, чтобы проверить свои маршруты / пути из скрипта / консоли:
rs = ActionController::Routing::Routes
rs.recognize_path '/blog/2010/1/10/entry-title'
и
app.blog_entry_path(@entry)
Удачи!
] Из []API Docs[]:[
] [map.connect 'articles/:year/:month/:day',
:controller => 'articles',
:action => 'find_by_date',
:year => /\d{4}/,
:month => /\d{1,2}/,
:day => /\d{1,2}/
]
[] Используя вышеприведенный маршрут, URL "localhost:3000/articles/2005/11/06" отображает на[
] [params = { :year => '2005', :month => '11', :day => '06' }
]
[]Похоже, что вы хотите сделать то же самое, но суффикс пост-слэга. Ваши новые и редактируемые ссылки все равно будут ссылками "старой школы", например "localhost:3000/articles/1/edit" и "localhost:3000/articles/new". Только ссылка "show" должна быть обновлена этим.[
].