Ruby on rails 在强参数中添加参数

Ruby on rails 在强参数中添加参数,ruby-on-rails,ruby,ruby-on-rails-3,ruby-on-rails-4,Ruby On Rails,Ruby,Ruby On Rails 3,Ruby On Rails 4,假设我有这样的参数: def boat_params params .require(:boat) .permit(:message :alarm_en, :alarm_es, :alarm_sv) end 我尝试的基本上是缩短此代码,包括: 但对于报警参数我在尝试时出现错误: 在.merge(报警参数) 我错了什么?谢谢 您正在对permit的结果调用merge,该结果返回Ac

假设我有这样的参数:

def boat_params
   params
      .require(:boat)
      .permit(:message
              :alarm_en,
              :alarm_es,
              :alarm_sv)
end

我尝试的基本上是缩短此代码,包括:

但对于
报警参数
我在尝试时出现错误:

.merge(报警参数)


我错了什么?谢谢

您正在对
permit
的结果调用
merge
,该结果返回
ActionController::Parameters
,而不是通用哈希

由于
permit
接受一个数组,因此实际上可以执行以下操作:

def alarm_params
  %w{ alarm_en alarm_es alarm_sv }
end

def boat_params
  params.require(:boat).permit(:message, *alarm_params)
end
如果您想使用元编程来提取语言列表并为每种语言创建允许的参数,就像您当前在
报警参数中所做的那样,您可以更容易地执行以下操作:

def languages
  # possibly use a more global config var, or ENV
  # e.g. ENV['SUPPORTED_LANGUAGES']
  %w{ en es sv }
end

def alarm_params
  languages.map { |lang| "alarm_#{lang}" }
end

不需要
每个
,也不需要显式的
返回

许可证的参数是数组,而不是散列。您可以尝试使用splat运算符
*

def boat_params
   params
      .require(:boat)
      .permit(:message, *alarm_params)
end

在我看来,这是一次糟糕的重构。无论如何,请尝试使用.permit(:message*alarm_参数)并将alarm_参数设置为数组
def alarm_params
    params = []
    ["en","es","sv"].each do |lang|
       params << "alarm_#{lang}" 
    end
    return params
end
 undefined method `to_hash' 
def alarm_params
  %w{ alarm_en alarm_es alarm_sv }
end

def boat_params
  params.require(:boat).permit(:message, *alarm_params)
end
def languages
  # possibly use a more global config var, or ENV
  # e.g. ENV['SUPPORTED_LANGUAGES']
  %w{ en es sv }
end

def alarm_params
  languages.map { |lang| "alarm_#{lang}" }
end
def boat_params
   params
      .require(:boat)
      .permit(:message, *alarm_params)
end