Подпишитесь на рассылку о самых интересных материалах в мире веб-разработки :)

Поймать хеш до update


(oleg) #1

Всем привет!
Собственно вопрос…
как можно поймать хеш в контроллере, который ушёл с формы??

Ситуация такая
После внесения в форму значения и после нажатия “обновить” необходимо поймать его
до того, как произойдёт update в контроллере.

пробывал @hash = params[:number]…нет…
пробывал ещё кучу чего, но не буду показывать…стыд сплошной…


(Марк) #2

У тебя приходят параметры на update. ты их можешь отловить(завит от того что ты подразумеваешь под словом отловить)

def update
    puts params[:number] # в логах увидишь правильно ли ты передал параметр.
    instance.update(number: params[:number]) # a тут уже проапдейтиш
end

(Nico Freeman) #3

Покажи форму, из которой ты отправляешь данные.
Есть гем ‘byebug’, который позволяет в нужном месте написать byebug, что аналогично breakpoint, и приведет к тому, что выполнение кода остановится на нужном месте и ты получишь в консоли сервера доступ к текущему namespace, где сможешь проверить что находится в переменных.

def update
  byebug
  #other code
end

(Иван Кисленко) #4

а ты пробувал bynding.pry (gem “pry”) или byebug в контроллере update ?, если у тебя даже они невызвуться то значит в роутах чтото нето, или на фронтєнде тоже чтото нето …
тоесть конроллер update утебя невызываеться, шли код сюды будем розбераться.


(oleg) #5

Я прошу прощения, не верно сформулировал вопрос)
есть поле формы #edit_person например:
= f.text_field :name
по нажатию кнопки этой формы
= f.button "Обновить имя"
хеш :name передаётся в контроллер в метод update
в этом методе есть момент когда обновляются значения записи
@person.update(params[:name]), так вот…мне необходимо поменять значение :name в контроллере до этого момента…
примерно так…

def update
puts "здесь хочется изменить параметр :name пришедший из формы edit_person"
if @person.update([:name])
redirect_to people_path
end


(Иван Кисленко) #6

дак в чем проблема
перед
if @person.update(params[:name])
передай:
params[:name] = ''My Name"

И потом
if @person.update(params[:name])
redirect_to people_path
end
и єтот апдейт изменит параметер по ключу, остальніе параметрі остануться нетронутіми, если ещо и в єто загвоздка)


(Марк) #7

Только name это не хэш, а ключ в хэше. и вам нужно изменить его значение (если я правильно понял)
Однако я не понимаю зачем вам нужно изменять параметр который пришел с клиентской части.
Легче (и я считаю правильнее) будет написать дополнительный метод

before_action :method_name, only: [:update]

def update 
  @person.update(full_name: @param_for_update) # full_name тоже в качестве примера
end

private
def method_name
  @param_for_update = "#{ params[:name] }+ params[:last_name]" # я предполагаю что вы хотите изменить немного параметр который пришел с клиента 
end

или вы можете просто вызвать этот метод без всяких before_action, непосредственно в методе update

def update 
  method_name
  @person.update(full_name: @param_for_update)
end

private
def method_name
  @param_for_update = "#{ params[:name] } + params[:last_name]" # я предполагаю что вы хотите изменить немного параметр который пришел с клиента 
end

(oleg) #8

но мне нужно изменить его в зависимости от того, что передано из формы,
то есть сначала нужно узнать что было введено в форме в этом поле…


(Марк) #9

тогда вы можете в методе method_name сделать проверку с if unless или еще чем угодно

def method_name
  if params[:name] == 'Dart'
      @param_for_update = "#{ params[:name] }+ Vader"
 else 
   # джедай
  end
end

(Иван Кисленко) #10

так я тебе и сказал как),
def update
params[:name] = params[:name] = "My Name"
if @person.update(params[:name])
redirect_to people_path
end


(oleg) #11

Ребят, всем спасибо огромное, благодаря вам нашел решение своей проблемы)
у меня в контроллере есть метод:

def parSmirror
params.require(:smirror).permit(:number)
end

чтобы получить значение введённое в форме в update нужно сделать

@number_val = parSmirror.values_at :number

а чтобы его изменить

parSmirror.merge number: 42


(Иван Кисленко) #12

короче вот тебе решение

class “Твой Клас”

before_save :gift_name :name

def gift_name(name)

    if self.name == name
          self.name = "custom name"
    else 
      return false
   end

end
короче логику работы модели я думаю ты понял )


(Lexxie) #14

Вообще печаль с руби разработчиками видимо. У одних камелкейс в методах, другие предлагают с парамсов в апдейт пихать. Запишитесь уже на курсы к Витале (thinknetica) и не парьте мозг)


(Андрей) #15

А лучше записать на менторство к Кириллу(mkdev) и парить мозг в правильном направлении)


(Vadim) #16

Есть еще вариант переписать сеттер в моделе

class User < ActiveRecord::Base

  def name=(value)
    if value == 'foo'
     value += 'bar'
    end
    
    self.name = value
  end

end

(Kvokka) #17

virtual attributes
это фишка ActiveRecord

ЗЫ: вот только не нужно переписывать штатные сеттеры в модели. От этого потом слишком несмываемый wtf?!