Вернуть управление из действия контроллера с лямбдой в Rails

Как я могу исправить эту ошибку? Я хочу высушить свой контроллер, и в каждом методе я проверяю работоспособность params[], просто проверяя наличие всех параметров.

Проблема с возвратом лямбды. Как это определено

def validate_input(parameters)
    return proc {
        if parameters.find_index { |i| i.nil? }
          error_message = {'Error' => 'Please fix some params'}.to_json
          render :json => error_message and return
        end
    }
  end

Затем внутри моего действия контроллера я делаю:

def action
  ...
  validate_input([my_sane_id, my_other_param]).call
  ...
end

И получаю ошибку: неожиданный возврат.


person valk    schedule 15.04.2013    source источник
comment
Получаете ли вы указание на то, на какой линии произошел неожиданный возврат? Я чувствую, что вам это может не понадобиться здесь: render :json => error_message and return из-за неявного возврата.   -  person Alex Lynham    schedule 15.04.2013
comment
Но это именно то, что я хочу сделать: после проверки просто вернуться из вызывающего метода. М-м-м. Немного подумав :) Я понимаю, что вы говорите. Скоро проверю.   -  person valk    schedule 16.04.2013
comment
Я просто подумал, что, увидев, что вы использовали proc, я знаю, что в некоторых версиях Ruby proc и lambda взаимозаменяемы, но Proc и Lambda ведут себя по-разному при возврате. innig.net/software/ruby/closures-in-ruby я думаю, статья, о которой я думаю.   -  person Alex Lynham    schedule 16.04.2013


Ответы (1)


def validate_input(*parameters)
  if parameters.any?(&:nil?)
     render :json => { :error => 'Please fix some params' }
     false
  else
     true
  end
end


def action
  ...
  return unless validate_input(my_sane_id, my_other_param)
  ...
end
  1. вы можете использовать оператор знака ("*"), чтобы получить неизвестное количество параметров в массив

  2. вы можете использовать метод ("любой?") вместо индекса (который является местоположением)

  3. вы можете использовать символ для обработки ("&:"), если вы выполняете вызов функции только для каждого элемента в массиве

  4. вам не нужно вызывать to_json, если вы визуализируете json

  5. лучше использовать символ в качестве хеш-ключа (": error")

  6. вы возвращаете true/false, чтобы указать, все ли в порядке, и если это ложь, просто вернитесь из действия

person amitkaz    schedule 09.05.2013
comment
спасибо, но в любом случае я хотел бы знать, как использовать его с proc, так как это особенность языка. - person valk; 09.05.2013