2015-11-28 3 views
0

У меня есть много продуктов в моем приложении. Пользователь может выбрать некоторые из них. Затем я генерирую частичное с выбранными произведениями. И я назначаю имя для каждого выбранного продукта, потому что я хочу иметь доступ к ним в своем контроллере через params [].Rails - собственный хэш внутри params []

Мой вопрос: Как я могу создать нечто вроде хэша со всеми выбранными вами продуктами? Тогда я мог бы получить такие продукты, как params [: selected-products] вместо params [: quantity-id]. Является ли это возможным? Я не уверен, если я могу использовать любой form_for, потому что на мой взгляд тихий сложный (есть один form_for и т.д.)

<% @chosen_products.each do |product| %> 
    <input name="quantity-<%=product.id %>" id="quantity-<%=product.id %>" class="product-quantity" type="number" step="0.01" > 
<% end %> 

@ chosen_prodcuts.inspect 2 продуктов:

[#<Product id: 6, name: "Jogurt", kalorycznosc: 100.0, woda: 2.0, bialko: 2.0, bialkoZwierzece: 2.0, bialkoRoslinne: 2.0, tluszcz: 2.0, weglowodany: 2.0, blonnik: 2.0, laktoza: 2.0, sacharoza: 2.0, cholesterol: 2.0, sod: 2.0, potas: 2.0, wapn: 2.0, fosfor: 2.0, magnez: 2.0, zelazo: 2.0, cynk: 2.0, miedz: 2.0, mangan: 2.0, retinol: 2.0, betaKaroten: 2.0, witD: 2.0, witE: 2.0, witB1: 2.0, witB2: 2.0, witB3: 2.0, witB6: 2.0, foliany: 2.0, witB12: 2.0, witC: 2.0, fenyloalanina: 2.0, ogolemNasyconeKwTl: 2.0, ogolemJednoKwTl: 2.0, ogoleWieloKwTl: 2.0, stosunekWieloKwTl: 2.0, measure: nil, conversion: nil, alias: nil, user_id: 1, group_id: 2, created_at: "2015-11-26 23:01:57", updated_at: "2015-11-27 22:28:02">, #<Product id: 7, name: "Ser biały2", kalorycznosc: 200.0, woda: nil, bialko: nil, bialkoZwierzece: nil, bialkoRoslinne: nil, tluszcz: nil, weglowodany: nil, blonnik: nil, laktoza: nil, sacharoza: nil, cholesterol: nil, sod: nil, potas: nil, wapn: nil, fosfor: nil, magnez: nil, zelazo: nil, cynk: nil, miedz: nil, mangan: nil, retinol: nil, betaKaroten: nil, witD: nil, witE: nil, witB1: nil, witB2: nil, witB3: nil, witB6: nil, foliany: nil, witB12: nil, witC: nil, fenyloalanina: nil, ogolemNasyconeKwTl: nil, ogolemJednoKwTl: nil, ogoleWieloKwTl: nil, stosunekWieloKwTl: nil, measure: "porcja", conversion: 70.0, alias: "twarożek", user_id: 1, group_id: 2, created_at: "2015-11-26 23:01:58", updated_at: "2015-11-27 21:54:06">] 

продукта. гь (тихий длинный):

class Product < ActiveRecord::Base 
belongs_to :user 
belongs_to :group 
has_many :ingredients 
has_many :meals, :through => :ingredients 

validates :user_id, presence: true 
validates :name, presence: true, length: {maximum: 50} 
validates :alias, length: {maximum: 50} 
validates :measure, length: {maximum: 50} 
validates :conversion, :numericality => true, :allow_nil => true 

validates :kalorycznosc, :numericality => true, :allow_nil => true 
validates :woda, :numericality => true, :allow_nil => true 
validates :bialko, :numericality => true, :allow_nil => true 
validates :bialkoRoslinne, :numericality => true, :allow_nil => true 
validates :bialkoZwierzece, :numericality => true, :allow_nil => true 
validates :tluszcz, :numericality => true, :allow_nil => true 
validates :weglowodany, :numericality => true, :allow_nil => true 
validates :blonnik, :numericality => true, :allow_nil => true 
validates :laktoza, :numericality => true, :allow_nil => true 
validates :sacharoza, :numericality => true, :allow_nil => true 
validates :cholesterol, :numericality => true, :allow_nil => true 
validates :sod, :numericality => true, :allow_nil => true 
validates :potas, :numericality => true, :allow_nil => true 
validates :wapn, :numericality => true, :allow_nil => true 
validates :fosfor, :numericality => true, :allow_nil => true 
validates :magnez, :numericality => true, :allow_nil => true 
validates :zelazo, :numericality => true, :allow_nil => true 
validates :cynk, :numericality => true, :allow_nil => true 
validates :miedz, :numericality => true, :allow_nil => true 
validates :mangan, :numericality => true, :allow_nil => true 
validates :retinol, :numericality => true, :allow_nil => true 
validates :betaKaroten, :numericality => true, :allow_nil => true 
validates :witB1, :numericality => true, :allow_nil => true 
validates :witB2, :numericality => true, :allow_nil => true 
validates :witB3, :numericality => true, :allow_nil => true 
validates :witB6, :numericality => true, :allow_nil => true 
validates :witB12, :numericality => true, :allow_nil => true 
validates :witC, :numericality => true, :allow_nil => true 
validates :witD, :numericality => true, :allow_nil => true 
validates :witE, :numericality => true, :allow_nil => true 
validates :foliany, :numericality => true, :allow_nil => true 
validates :fenyloalanina, :numericality => true, :allow_nil => true 
validates :ogolemJednoKwTl, :numericality => true, :allow_nil => true 
validates :ogolemNasyconeKwTl, :numericality => true, :allow_nil => true 
validates :ogoleWieloKwTl, :numericality => true, :allow_nil => true 
validates :stosunekWieloKwTl, :numericality => true, :allow_nil => true 
end 
+0

Вы можете вставить, как выглядит '@ selected_products' с проверкой? также вставьте модель продукта. – matanco

+0

Я бы порекомендовал вам использовать помощники формы [Rails] (http://api.rubyonrails.org/classes/ActionView/Helpers/FormTagHelper.html#method-i-number_field_tag), так как «вход» в вашем первом примере кода выглядит немного грязно. Так, например: '<% = number_field_tag:" quantity - # {product.id} ", class: 'product-quantity', step: '0.01'%>'. Это создает такую ​​же разметку HTML, но намного чище. – Tobias

ответ

0

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

<% chosen_products_csv = @chosen_products.map{|p| p.id }.join(',') %> 
<input name="chosen_products" id="chosen_products class="product-quantity" type="text" step="0.01" value="<%= chosen_products_csv %>" > 

Он даст вам вход, значение которого представляет собой список идентификаторов продуктов, разделенных комой.

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

unless params['chosen_products'].blank? 
    product_ids = params['chosen_products'].split(',').map{|p| p.to_i } 
    @products = Product.where(id: product_ids) if product_ids.length > 1 || product_ids.first != 0 
end 

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

+0

Фактически, у меня есть это значение (selected_products) в моем контроллере, но в разных действиях (вызвано ajax). Можно ли получить это значение и в создании действия? – user2948135

+0

в случае 'params ['selected_products']' is nil? Я бы определенно сказал, что это очень опасный ответ! Вы могли бы написать это лучше. почему бы не сделать другой звонок и безопасную проверку внутри? – Rubyrider

+0

, конечно, вы правы, это подразумевалось как идея, как это может быть достигнуто, поскольку ОП не предоставил никакого кода контроллера, в который может быть установлено решение. В любом случае, я поменял его на ваше предложение. – bosskovic

Смежные вопросы