Так у тебя тогда другая задача - просто h[key]=<new value>. И всё. Или я что-то не понимаю. Выложи свой пример.
Курилка для программистов
#662
Отправлено 02 марта 2017 - 17:57
del
Видимо, я как-то иначе понимаю "обновить по ключу".
Сообщение изменено: Zero (02 марта 2017 - 17:59 )
-----------------------------------------------------------------------
Ясность - одна из форм полного тумана. Форумчане, давайте жить дружно!
#663
Отправлено 02 марта 2017 - 18:04
Сообщение изменено: kuznets (02 марта 2017 - 18:06 )
Типичный, классический кузнец.
#664
Отправлено 02 марта 2017 - 18:18
Что-то тут не то. Ты обращаешься к несуществующему ключу хэша и каким-то образом получаешь значение 1,00 (должно вернуть nil). А потом обновляешь (устанавливаешь) значение не туда, куда надо.
Сделаю так же маленькую ремарку. То, с чем ты имеешь дело - это хэш(Hash). Массив (Array) - это обычная коллекция. Если кто-то другой будет работать с твоим кодом, он не поймет, зачем ты одно обозвал другим (имеется ввиду имя переменной "arr")
Сообщение изменено: Дык (02 марта 2017 - 18:20 )
Вначале делаю, потом думаю
#665
Отправлено 02 марта 2017 - 18:51
Ну ок хэш.
вот так точнее:
def create @item = current_user.items.new(item_params) puts 'Params 1:' puts item_params puts 'Item Price: ' + item_params["unit_price"] ... end ## Вывод в консоли ## Started POST "/items" for 127.0.0.1 at 2017-03-02 18:43:16 +0200 Processing by ItemsController#create as HTML Parameters: {"utf8"=>"✓", "item"=>{"name"=>"aaa", "unit_price"=>"1,00"}, "commit"=>"Save Item"} User Load (1.7ms) SELECT "users".* FROM "users" WHERE "users"."id" = ? ORDER BY "users"."id" ASC LIMIT ? [["id", 2], ["LIMIT", 1]] Params 1: #<ActionController::Parameters:0x007f4925d99f20> Item Price: 1,00
Попробовал так:
price = '100' item_params.each do |key| if key == 'item' key.each do |key2| if key2 == 'unit_price' key2 = price end end end end # результат puts 'Item Price: ' + item_params["unit_price"] # => Item Price: 1,00
Сообщение изменено: kuznets (02 марта 2017 - 18:53 )
Типичный, классический кузнец.
#666
Отправлено 02 марта 2017 - 19:07
Хоть ты и не выложил метод "item_params", я предполагаю, что там должно быть что-то вроде этого:
def item_params
item_params = params.require(:item).permit(:name, :unit_price) # залезаем в сам item. остальные параметры нам не нужны. NB! Возможно надо сделать ".to_h" в конце.
item_params[:unit_price] *= 100 # это моё предположение относительно того, что ты пытаешься сделать
item_params
end
При очень большом желании можно и в одну строку сделать, но это так, допом ))
Сообщение изменено: Дык (02 марта 2017 - 19:10 )
Вначале делаю, потом думаю
#667
Отправлено 02 марта 2017 - 19:10
Там такое
def item_paramsparams.require(:item).permit(:name, :unit_price)end
Сообщение изменено: kuznets (02 марта 2017 - 19:16 )
Типичный, классический кузнец.
#668
Отправлено 02 марта 2017 - 19:23
В таком случае копируй результат метода в переменную и уже на месте делай преобразование.
item_params = self.item_params.dup # (dup не обязательно, но на всякий случай, если будешь в будущем кэшировать (мемоизировать) результат метода. Иначе ты перепишешь исходные данные item_params[:unit_price] *= 100 # или любым другим методом current_user.items.create!(item_params)
Сообщение изменено: Дык (02 марта 2017 - 19:24 )
Вначале делаю, потом думаю
#669
Отправлено 02 марта 2017 - 20:57
Сделаю так же маленькую ремарку. То, с чем ты имеешь дело - это хэш(Hash). Массив (Array) - это обычная коллекция.
Это не очень хорошая ремарка, кмк. Или само название Hash отражает детали реализации, а не свойства структуры данных.
-----------------------------------------------------------------------
Ясность - одна из форм полного тумана. Форумчане, давайте жить дружно!
#670
Отправлено 02 марта 2017 - 21:35
Навесил я все эту батву на идею, запили дебагинг
item_params.each do |key| end
Итерирует по массиву или хэшу мне в данном случае пока что одночленно {"name"=>"aaa", "unit_price"=>"1,00"}
item_params.each do |key| if key == 'unit_price' # true item_params[key] = price # хз что, но на выходе, # он его проходит а состояние item_params я не вижу в дебагере end end
Типичный, классический кузнец.
#671
Отправлено 02 марта 2017 - 21:44
Навесил я все эту батву на идею, запили дебагинг
item_params.each do |key| endИтерирует по массиву или хэшу мне в данном случае пока что одночленно {"name"=>"aaa", "unit_price"=>"1,00"}
item_params.each do |key| if key == 'unit_price' # true item_params[key] = price # хз что, но на выходе, # он его проходит а состояние item_params я не вижу в дебагере end end
А зачем ты итерируешь по ключам? Что ты хочешь добиться?
Вначале делаю, потом думаю
#675
Отправлено 02 марта 2017 - 22:23
А переведи
.each - это прохождение по всем ключам (или парам ключ-значение). И ты по ним проходишься только ради того, чтобы найти 'unit_price' и обновить значение (если найдено).
Цена такого подхода - O(N).
item_params[:unit_price]=<new val> -> O(1). Или я что-то упускаю из виду?
P.S Обрати внимание при работе с Hash, что доступ по стринговому ключу (String) не тоже самое, что и доступ по символьному ключу (Symbol).
item_params[:unit_price] != item_params['unit_price'], если только "item_params" не экземпляр класса HashWithIndifferentAccess, которому на это дело наплевать.
Вначале делаю, потом думаю
#676
Отправлено 02 марта 2017 - 23:01
То, что это прохождение по ключам это я понял.
Из стандартных языков в вполне осознал что пройтись по ключам, что бы найти 'unit_price' вполне норма тема, но тут я писал выше кому то было скучно и работу с массивами / хэшами сделали крайне интересной ))
В общем я 5 день в руби ибо мне надо сделать проект и пока что я в ауе, хотя по началу было все очень быстро и само собой.
В общем я пока не понял как решить мою проблему.
Типичный, классический кузнец.
#677
Отправлено 02 марта 2017 - 23:17
Какой интересный диалог... Я Руби первый раз вижу. Но неужели с ним такие сложности?
arr: {"utf8"=>"✓", "item"=>{"name"=>"aaa", "unit_price"=>"1,00"}}
Мне надо поменять "unit_price"=>"1,00" на "unit_price"=>"100"puts arr["unit_price"] # => 1,00arr["unit_price"] = "100"puts arr["unit_price"] # => 1,00
Этот arr разве не является вложенным hash'ем? Почему нельзя получить доступ к значению unit_price через arr["item"]["unit_price"] ?
#678
Отправлено 02 марта 2017 - 23:39
Какой интересный диалог... Я Руби первый раз вижу. Но неужели с ним такие сложности?
Этот arr разве не является вложенным hash'ем? Почему нельзя получить доступ к значению unit_price через arr["item"]["unit_price"] ?
А вот нельзя. Я сегодня с ним целый день снашаюсь, завтра видимо продолжу.
Сообщение изменено: kuznets (02 марта 2017 - 23:40 )
Типичный, классический кузнец.
#679
Отправлено 02 марта 2017 - 23:52
А вот нельзя.
Мда? А почему мне можно?
Пробую на https://repl.it/languages/ruby
Код:
arr = {"utf8"=>"✓", "item"=>{"name"=>"aaa", "unit_price"=>"1,00"}} puts arr["item"] puts arr["item"]["unit_price"] arr["item"]["unit_price"] = 100 puts arr["item"]["unit_price"]
Консоль:
ruby 2.3.1p112 (2016-04-26 revision 54768) [x86_64-linux] {"name"=>"aaa", "unit_price"=>"1,00"} 1,00 100 => nil
#681
Отправлено 03 марта 2017 - 08:08
Alexey_L,
Как я писал выше там не этот хэш arr = {"utf8"=>"✓", "item"=>{"name"=>"aaa", "unit_price"=>"1,00"}}
def create @item = current_user.item.new(item_params) puts 'Params 1:' puts item_params puts 'Item Price: ' + item_params["unit_price"] price = '100' item_params["unit_price"] = price # пытаюсь присвоить по ключу как у тебя в примере puts 'Total Price: ' + item_params["unit_price"] end ## Консоль ## ## item_params это <ActionController::Parameters:0x007fc6d057ea60> но итерация each do идет по нему "item"=>{"name"=>"aaa", "unit_price"=>"1,00"} ## Params 1: #<ActionController::Parameters:0x007fc6d057ea60> Item Price: 1,00 Total Price: 1,00
Скопировал в отдельную переменную item_params
params = stock_params # что есть этот <ActionController::Parameters:0x007fc6dd0ec2b0> ?
картинка
https://3.downloader...f10c2e9555851db
Сообщение изменено: kuznets (03 марта 2017 - 08:19 )
Типичный, классический кузнец.
#682
Отправлено 03 марта 2017 - 08:41
Типичный, классический кузнец.
#685
Отправлено 03 марта 2017 - 09:30
руби говно )
если я покажу свои сиськи то ты не отстанешь от них никогда, и я стану в сто раз популярнее всех баб на форуме и язык у тебя прилипнет к бороде)))) Потому что у меня очень роскошный бюст, но я ни за что не нуждаюсь, чтоб на него пялились похотливые ненасытные брюсы; // удалите сообщения с моей синей фоткой где я под феном , я вам другую поставлю)))
#687
Отправлено 03 марта 2017 - 09:42
Я за последние 3 недели сделал 2 небольших проекта на node и ruby (с нуля), первый мне понравился больше, хотя по началу меня подкупала простота руби, как то само все делает за тебя, он отлавливать баги сложнее, да и синтаксис несколько отличается от привычного.
Типичный, классический кузнец.
#690
Отправлено 03 марта 2017 - 19:31
если тебе надо будет использовать руби, то не надо тебе его лучше использовать))
если я покажу свои сиськи то ты не отстанешь от них никогда, и я стану в сто раз популярнее всех баб на форуме и язык у тебя прилипнет к бороде)))) Потому что у меня очень роскошный бюст, но я ни за что не нуждаюсь, чтоб на него пялились похотливые ненасытные брюсы; // удалите сообщения с моей синей фоткой где я под феном , я вам другую поставлю)))