【问题标题】:Return control from controller's action with lambda in Rails在 Rails 中使用 lambda 从控制器的操作中返回控制
【发布时间】:2013-04-15 12:34:02
【问题描述】:

如何解决此错误?我想干燥我的控制器,并且在每种方法中我对 params[] 执行完整性检查,只需确保所有参数都存在。

问题在于 lambda 的返回。正如它所定义的那样

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

并得到错误:意外返回。

【问题讨论】:

  • 您是否知道意外返回在哪一行?我的直觉是你可能在这里不需要它:render :json => error_message and return 由于隐式返回。
  • 但这正是我想要做的:验证后,只需从调用方法返回。嗯。想了一会儿 :) 我明白你在说什么。很快就会检查。
  • 我只是觉得看到你使用了proc - 我知道在某些版本的Ruby中proclambda是可以互换的,但是ProcLambda的行为不同返回时。 innig.net/software/ruby/closures-in-ruby我想是我想到的文章。

标签: ruby-on-rails controller return dry proc


【解决方案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. 您可以使用 splat 运算符 ("*") 将未知数量的参数放入数组中

  2. 您可以使用 ("any?") 方法代替索引(即位置)

  3. 如果您只对数组中的每个项目进行函数调用,则可以使用符号来触发 ("&:")

  4. 如果渲染 json,则不需要调用 to_json

  5. 最好使用符号作为哈希键(“:error”)

  6. 您返回 true/false 表示一切正常,如果为 false,则从操作中返回

【讨论】:

  • 谢谢,但无论如何我很想知道如何将它与 proc 一起使用,因为这是语言的特性。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-09-13
  • 1970-01-01
  • 1970-01-01
  • 2017-09-03
  • 1970-01-01
  • 2014-01-15
相关资源
最近更新 更多