Рендеринг полиморфного частичного с необязательными унаследованными ресурсами own_to / nested (Rails 3.1) - PullRequest
2 голосов
/ 23 августа 2011

Попытка сделать что-то действительно простое - может, кто-нибудь предоставит правильное заклинание?

По сути, мы Biscuit необязательно вложены в User, поэтому нам нужны такие маршруты, как:

/biscuits
/biscuits/1
/users/2/biscuits
/users/2/biscuits/3

и т.д.

У нас есть представления типа biscuits/index, которые вызывают частичный biscuits/_index для отображения списка. Я хотел бы вызвать этот же фрагмент из представления профиля пользователя, users/edit, но мне неясно, какие хелперы resource_url использовать:

resources :users do
  resources :biscuits
end

class BiscuitsController < InheritedResources::Base
   belongs_to :user, optional: true
end

Пользователи / edit.html.haml:

= render 'biscuits/index', biscuits: @user.biscuits.all

печенье / _index.html.haml:

  - biscuits.each do |biscuit|
    %tr
      %td= biscuit.title
      %td= link_to image_tag(biscuit.file_url(:thumb,:large)), resource_url(biscuit)
      %td
        = link_to 'Show', resource_url(biscuit)
        &nbsp;|&nbsp;
      %td
        = link_to 'Edit', edit_resource_url(biscuit)

Эта часть отлично работает, когда вызывается из BiscuitsController в /users/1/biscuits, но она бомбардирует с NoMethodError in Users#edit undefined method 'user_url' for #<UsersController> при вызове из UsersController в /users/1/edit - кажется, resource_url относится к пользователю здесь не коллекция печенья.

Как я могу заставить ресурс / коллекцию быть любой коллекцией ресурсов, независимо от текущего контроллера?

Какой лучший способ сделать это?

Также, скажем, мы переопределяем UsersController#collection и #resource, эти методы на UsersController вызываются, если маршрут вызывает BiscuitsController через /users/1/biscuits? Или только один Controller на каждый запрос когда-либо создавался Rails?

Ответы [ 2 ]

1 голос
/ 09 марта 2012

Чак на неглубоком маршруте, то есть:

resources :users, :shallow => true do
  resources :biscuits
end

, затем делайте рейковые маршруты и посмотрите, поможет ли это

1 голос
/ 25 октября 2011

относительно поведения маршрутов - насколько я знаю, если вы хотите использовать маршрут как вложенный, так и не вложенный, вам действительно следует определить его дважды. т.е.

resources :users do
  resources :biscuits
end
resources :biscuits

, тем не менее, представляется целесообразным вкладывать ресурсы только в том случае, если нет смысла получать к ним доступ без вложения. если вы оставите только не вложенные маршруты для печенья, это может решить вашу проблему.

относительно resource_url - ваши ссылки на resource_url и методы сбора указывают на то, что вы используете плагин или гем, трудно понять, что происходит, не зная, какой плагин вы используете, тем более что он, кажется, является источником вашей проблемы.

заменив "resource_url" помощником по линиям

def nested_resource_path(*args)
  args = args.compact
  return args[0] if args.size == 1
  return args
end

называется так:

nested_resource_path(@user, biscuit) and
nested_resource_path(:edit, @user, biscuit)

где @user равен nil при доступе к BiscuitsController # index
должно работать.

...