Наилучшая практика для представления вложенных ресурсов в Rails? - PullRequest
5 голосов
/ 17 марта 2010

У меня довольно простая модель; Пользователи имеют множество продуктов. Я хотел бы иметь возможность просматривать список всех продуктов, а также список продуктов, связанных с данным пользователем. Мои маршруты настроены так:

/products
/products/:id
/users
/users/:id
/users/:id/products

Смысл в том, что я хотел бы по-разному отображать список продуктов в представлении product # index и в представлении user / products # index .

Есть ли «правильный» способ сделать это? Мое текущее решение состоит в том, чтобы определять продукты как вложенный ресурс внутри пользователей, а затем проверять наличие параметров [: user_id] - если он найден, я отображаю шаблон с именем index_from_user, в противном случае я просто отображаю типичный шаблон index.

Это ситуация, с которой я часто сталкиваюсь - если есть предпочтительный способ сделать это, я бы хотел знать ...

1 Ответ

2 голосов
/ 14 сентября 2010

Вы можете объявить два «продукта» маршрута - один под пользователями, а другой независимый от пользователей, например:

map.resources: продукты map.resources: users,: has_many =>: products

Они оба будут искать «ProductsController # index», но у второго будет «user_id», предварительно заполненный из маршрута (примечание: «user_id», а не только «id»)

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

Вам потребуется добавить before_filter в ProductController, чтобы на самом деле создать экземпляр модели пользователя, прежде чем вы сможете ее использовать, например:

before_filter :get_user # put any exceptions here

def index
  @products = @user.present? ? @user.products : Product.all
end

# all the other actions here...


# somewhere near the bottom...
private

def get_user
  @user = User.find(params[:user_id])
end

Если вы действительно хотите отобразить совершенно разные представления, вы можете просто сделать это явно в действии index, например:

def index
  @products = @user.present? ? @user.products : Product.all
  if @user.present?
     return render(:action => :user_view) # or whatever...
  end
  # will render the default template...
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...