Создание вложенного атрибута из нескольких родительских объектов - PullRequest
0 голосов
/ 11 апреля 2011

В настоящее время я пытаюсь использовать link_to с вспомогательным методом, который создает ссылки для динамического создания элементов, а не с помощью методов new_object_path.Rails 3 допускает полиморфные URL-адреса, которые fl00r помог мне идентифицировать и использовать в форме, которую я искал изначально.Однако, хотя метод Rails 'polymorphic_url, как показано здесь, передает аргумент в запросе http, соответствующее поле формы на возвращаемой странице не заполняется и не устанавливается.Я пытаюсь построить order_item из order, который также построен из photo.

Кто-нибудь видит, что здесь происходит не так?Ниже приведен соответствующий код:

# the helper method
def add_cart_button_for(arr, attr_hash={})
  link_to button(:cart_add), polymorphic_url( [:new] + arr, attr_hash )
end

# the call in index.html.haml
= add_cart_button_for [current_order, :order_item], :photo_id => photo.id

# _form.html.haml for order_item
- form_for [ @order, @order_item ] do |f|
  %p
    = f.label :photo_id
    %br
    = f.text_field :photo_id

Вот оригинальный вопрос:

Я пытаюсь создать ссылку для создания [:new, @order, @order_item], где @order_item.photo_id может быть передано вссылка.

Теперь я не уверен, имеет ли это смысл, поэтому я попытаюсь прояснить мою проблему здесь.

Из того, что я видел, в Rails 3 появился новыйсинтаксис для связи с действиями с ресурсом с использованием массива, структурированного как [:action, object] или для глубоко вложенных ресурсов, [:action, parent, child].Для этого конкретного примера я использую link_to [:new, @order, :order_item].Эти кнопки будут прикреплены к каждой фотографии в фотогалерее.

Можно ли передать id фотографии в качестве атрибута photo_id нового элемента заказа?

Итакпока я пробовал link_to [:new, @order, :order_item], :photo_id => photo.id, но, похоже, это не работает.Я также попытался поместить :photo_id в явный хеш.Есть ли способ следовать этому новому синтаксису и достичь этой функциональности?

Обновление: я действительно надеюсь найти что-то вроде:

 link_to "new photo", [:new, @order, :order_item => {:photo_id => photo.id}]

, где я как бывыполнение: build, но с использованием не только атрибутов из поставляемой модели построителя.

ОБНОВЛЕНИЕ 11 апреля 2011 У меня все заработало, и я могу передать атрибут в запрос get с помощью polymorphic_url как показано ниже:

# the helper method
def add_cart_button_for(arr, attr_hash={})
  link_to button(:cart_add), polymorphic_url( [:new] + arr, attr_hash )
end

# the call in index.html.haml
= add_cart_button_for [current_order, :order_item], :photo_id => photo.id

Кажется, что это должно работать.Я вижу запрос get, который, кажется, работает должным образом:

Started GET "/orders/1/order_items/new?photo_id=130" for 127.0.0.1 at 2011-04-11 18:11:07 -0400
  Processing by OrderItemsController#new as HTML
  Parameters: {"photo_id"=>"130", "order_id"=>"1"}

, а URL-адрес соответствует ожидаемому, но форма, похоже, не перехватывает эту переменную из URL-адреса.

: order_id работает.Однако: photo_id, похоже, не переносится на новую страницу OrderItems #.Я создал text_field для :photo_id, и он каждый раз пуст.Это в attr_accessible.Я не понимаю, почему это не работает.

Ответы [ 2 ]

1 голос
/ 11 апреля 2011

Нет.

Вы можете попробовать это

link_to "New ...", polymorphic_url([:new, @order, :order_item], :photo_id => photo.id)

или старая школа link_to

link_to "New ...", new_order_order_item(@order, :photo_id => photo.id)
0 голосов
/ 26 апреля 2011

Я наконец понял это.

В моем новом действии OrderItemsController # моя функция build либо не принимала параметров, либо params[:order_item] в качестве параметра.Поскольку параметр, переданный из polymorphic_url, на самом деле не был связан с каким-либо объектом, а был просто необработанным атрибутом, я попытался просто передать весь хэш params в функцию сборки.Работал как шарм.Итак, я использую этот код для ссылки:

= add_cart_button_for [current_order, :order_item], :photo_id => photo.id

и этот код в моем контроллере:

def new
  @order_item = @order.order_items.build(params)
end



def create
  @order_item = @order.order_items.build(params[:order_item])
  if @order_item.save
    @order.save
    flash[:notice] = "Successfully created order item."
    redirect_to @order
  else
    render :action => 'new'
  end
end

Теперь, когда весь хэш params проходит, форма может найтиправильное фото при создании новой позиции заказа.

...