Каков синтаксис ActiveScaffold для ссылки «has_many» в виде списка, если он помещен в помощник? - PullRequest
0 голосов
/ 05 марта 2012

В «продукте» есть много «параллельных_продуктов»:

class Product < ActiveRecord::Base
  has_many :parallel_products, :class_name => "Product", :foreign_key => "master_product_id"
end

В контроллере я добавляю столбец «parallel_products» к представлению списка:

class ProductsController < ApplicationController
  active_scaffold :product do |config|
    config.list.columns = [ :parallel_products ]
  end
end

Это дает мне сгенерированную ActiveScaffold ссылку в виде списка для просмотра, создания и редактирования параллельных продуктов выбранного продукта.

Пока все хорошо.

Теперь я хочу указать эту ссылку «parallel_products» в помощнике. Никаких изменений в самой ссылке, она должна быть точно такой же, как и ссылка, сгенерированная ActiveScaffold. Причина в том, что мне нужно добавить условие, чтобы ссылка отображалась только при определенных обстоятельствах.

Сгенерированная ActiveScaffold ссылка выглядит в журнале следующим образом:

Started GET "/products?assoc_id=6&association=parallel_products&eid=products_6_parallel_products&parent_scaffold=products&adapter=_list_inline_adapter" for 172.16.99.11 at 2012-03-05 09:37:45 +0100
  Processing by ProductsController#index as JS
  Parameters: {"assoc_id"=>"6", "association"=>"parallel_products", "eid"=>"products_6_parallel_products", "parent_scaffold"=>"products", "adapter"=>"_list_inline_adapter"}

Мое лучшее предложение для ссылки отношения Active_affold has_many в помощнике:

link_to("link text", :controller => "products", :assoc_id => record.id, :association => "parallel_products", :eid => "products_#{record.id}_parallel_products", :parent_scaffold => "products", :adapter => "_list_inline_adapter")

Это дает мне в журнале:

Started GET "/products?adapter=_list_inline_adapter&assoc_id=6&association=parallel_products&eid=products_6_parallel_products&parent_scaffold=products" for 172.16.99.11 at 2012-03-05 09:39:38 +0100
  Processing by ProductsController#index as HTML
  Parameters: {"adapter"=>"_list_inline_adapter", "assoc_id"=>"6", "association"=>"parallel_products", "eid"=>"products_6_parallel_products", "parent_scaffold"=>"products"}

Моя ссылка не работает, но, кажется, очень близко. Разница лишь в том, что сгенерированное состояние ссылки «ProductsController # index как JS» и состояние моего синтаксиса «ProductsController # index как HTML».

Каков правильный синтаксис ActiveScaffold для создания ссылки на просмотр списка отношений has_many в помощнике?

1 Ответ

0 голосов
/ 06 июня 2012

Спасибо Серхио Камбре за помощь в решении этой проблемы.

Это синтаксис для ссылки на ассоциацию has_many, если он помещен в помощник:

link_to("link text", {:controller => "products", :association => "parallel_products",
  :parent_scaffold => "products", :product_id => record.id}, :class => 'index as_action',
  :id => "as_products-index-parallel_products-#{record.id}-link",
  :remote => true, :data => {:position => :after, :action => 'index'})

Чтобы ответить на вопрос в полном объеме, вот как это можно реализовать, чтобы точно заменить автоматически сгенерированную связь ассоциации AS:

def parallel_products_column(record)
  if product.parallel_products.blank?
    link_text = "-"
    css_class = "index as_action empty"
  else
    link_text = product.parallel_products[0...3].map{ |p| p.name }.join(", ")
    if product.parallel_products.length > 3
      link_text += ", &hellip; (#{product.parallel_products.length})"
    end
    css_class = "index as_action"
  end
  link_to(link_text.html_safe, {:controller => "products", :association => "parallel_products",
    :parent_scaffold => "products", :product_id => record.id}, :class => css_class,
    :id => "as_products-index-parallel_products-#{record.id}-link",
    :remote => true, :data => {:position => :after, :action => 'index'})
end

Вам понадобится небольшой хак для класса css 'empty', например:

.active-scaffold a.empty {
  display: block;
  text-align: center;
}

Примечание: Это для Rails / AS 3.1 или новее.

...