переопределение раутов

1 view
Skip to first unread message

Alexey Poimtsev

unread,
Jul 19, 2010, 3:57:41 AM7/19/10
to RubyOnRails to russian
Коллеги,
вопрос скорее не столько функциональный, сколько в том, чтобы сделать
код красивым.

Есть Project и Task и соответственно P has_many T. С другой стороны -
таск может быть и не заассигнен на проект. Теоретически все просто.
Есть рауты

map.resources :projects, :except => "show" do |project|
project.resources :tasks
end
map.connect "projects/:project_id", :controller => "tasks", :action
=> "index"
map.resources :tasks

тоже все вроде красиво. На всех страницах Task-вьюх, присутствует
ссылка на new_task_path, edit_task_path итд и таски при добавлении не
ассигнятся на проект. А хочется, чтобы со страницы проекта - таск
ассигнился на проект, а с основной страницы тасков - чтобы они просто
складировались для дальнейшего раскидывания по проектам при
необходимости. А вот теперь вопрос - как красиво (возможно)
переопределить рауты, не проверять каждый раз присутствие
параметра :project_id и в случае его наличия - делать
new_project_task_path, а в случае отсутствия - new_task_path?

Алексей Осипенко

unread,
Jul 19, 2010, 4:27:17 AM7/19/10
to RubyOnRails to russian
link_to "bla bla bla", { :id => @task.id, :action => :edit }
Прожект_айди останется нетронутым в случае его наличия.

Еще можно определить свои general_task_path. По сути *_path и *_url -
это обычные переменные. Значение оных можно определять заранее, в
зависимости от наличия project_id

А вообще определи таски без проекта, как таски, привязанные к проекту
"проект для незаасигненых тасков".

Dmitry Zhmurko

unread,
Jul 19, 2010, 4:37:01 AM7/19/10
to RubyOnRails to russian
вероятно, нужен параметр :shallow в роутах
http://guides.rubyonrails.org/routing.html
раздел 3.8.4 Shallow Nesting
map.resources :publishers, :shallow => true do |publisher|
publisher.resources :magazines do |magazine|
magazine.resources :photos
end
end
дарит нам
/publishers/1 ==> publisher_path(1)
/publishers/1/magazines ==> publisher_magazines_path(1)
/magazines/2 ==> magazine_path(2)
/magazines/2/photos ==> magazines_photos_path(2)
/photos/3 ==> photo_path(3)

On Jul 19, 10:57 am, Alexey Poimtsev <a...@alec-c4.com> wrote:

Alexey Poimtsev

unread,
Jul 19, 2010, 4:58:07 AM7/19/10
to RubyOnRails to russian
Не совсем так ... во вьюхах же будет прописан new_task_path в
независимости от наличия project_id и соответственно будет отправлять
new_task_path(3) на /tasks/3 ... Вопрос не в том - как обработать
рауты, а как правильно использовать метод new_task_path и надо ли его
переопределять ...

On 19 июл, 12:37, Dmitry Zhmurko <zhmu...@gmail.com> wrote:
> вероятно, нужен параметр :shallow в роутахhttp://guides.rubyonrails.org/routing.html

Alexey Poimtsev

unread,
Jul 19, 2010, 5:02:39 AM7/19/10
to RubyOnRails to russian
Леш, в принципе все раут-хэлперы можно написать с нуля, но может есть
возможность сделать это красиво? а то как-то не айс писать новый
хэлпер типа

def general_new_task_path
params[:project_id].nil? ? new_task_path : new_project_task_path
end

вот я и ищу способ сделать это красиво :)

Alex Grigorovich

unread,
Jul 19, 2010, 6:01:57 AM7/19/10
to ror...@googlegroups.com
2010/7/19 Alexey Poimtsev <al...@alec-c4.com>:

> А вот теперь вопрос - как красиво (возможно)
> переопределить рауты, не проверять каждый раз присутствие
> параметра :project_id и в случае его наличия - делать
> new_project_task_path, а в случае отсутствия - new_task_path?

polymorphic_url([@project, @task], :action => 'new')

Alexey Poimtsev

unread,
Jul 19, 2010, 6:13:09 AM7/19/10
to RubyOnRails to russian
о, похоже на то что надо :))) спасибо :)

On 19 июл, 14:01, Alex Grigorovich <alex.grigorov...@gmail.com> wrote:
> 2010/7/19 Alexey Poimtsev <a...@alec-c4.com>:

Vitaly Kushner

unread,
Jul 19, 2010, 6:28:09 PM7/19/10
to RubyOnRails to russian
если юзать InheritedResources то resource_url будет учитывать текущий
"parent"
что то вроде:

class TasksController < InheritedResources::Base
belongs_to :project, :optional => true # <<= при наличии
params[:project_id] определит @project и будет использовать
@project.tasks.find вместо Task.find etc.
end

теперь во views new_resource_url будет либо /tasks/new либо /
projects/.../tasks/new

--
Vitaly Kushner
http://twitter.com/vkushner
Founder, Astrails Ltd. http://astrails.com/
Check out our blog: http://blog.astrails.com/

Alexey Poimtsev

unread,
Jul 20, 2010, 7:48:48 AM7/20/10
to RubyOnRails to russian
надо попробовать, спасибо :))))

On 20 июл, 02:28, Vitaly Kushner <vita...@gmail.com> wrote:
> если юзать InheritedResources то resource_url будет учитывать текущий
> "parent"
> что то вроде:
>
> class TasksController < InheritedResources::Base
>   belongs_to :project, :optional => true # <<= при наличии
> params[:project_id] определит @project и будет использовать
> @project.tasks.find вместо Task.find etc.
> end
>
> теперь во views new_resource_url  будет либо   /tasks/new   либо    /
> projects/.../tasks/new
>
> --
> Vitaly Kushnerhttp://twitter.com/vkushner

> Founder, Astrails Ltd.http://astrails.com/

Reply all
Reply to author
Forward
0 new messages