【问题标题】:Rails 4 Unpermitted parameters for array of coordinateRails 4坐标数组的不允许参数
【发布时间】:2014-02-13 07:15:20
【问题描述】:

我关注了这个Rails 4 Unpermitted Parameters for Array,但它对我不起作用。这是我的模型

class Building
  include Mongoid::Document
  include Mongoid::Spacial::Document

  field :address,            :type => String
  field :location,           :type => Array, spacial: {lng: :longitude, lat: :latitude, return_array: true }
end

在控制器中

def update
  ret = building_params.has_key?(:address) ? building_address_path(@building) : edit_building_path(@building)
  respond_to do |format|
    if @building.update(building_params)
      format.html { redirect_to ret, notice: 'Building was successfully updated.' }
      format.json { head :no_content }
    else
      format.html { render action: 'edit' }
      format.json { render json: @building.errors, status: :unprocessable_entity }
    end
  end
end

def building_params
  params.require(:building).permit(:address, :location => [])
end

html表单

<input id="building_location" name="building[location]" type="text" value="[112.70665740967, -7.26961135864]" />

服务器日志

Started PATCH "/id/buildings/52fb014862696b06ad100000" for 192.168.12.211 at 2014-02-13 14:08:24 +0700
Processing by BuildingsController#update as HTML
  Parameters: {"utf8"=>"✓", "authenticity_token"=>"j/n8Sv1CmEf5LKQMjNb7iQndJjDzWqkxsGrVIdS6i54=", "building"=>{"location"=>"[112.75631079999994,-7.272195699999999]", "address"=>"Jalan Dharmawangsa"}, "commit"=>"Simpan", "locale"=>"id", "id"=>"52fb014862696b06ad100000"}
  MOPED: 127.0.0.1:27017 COMMAND      database=admin command={:ismaster=>1} runtime: 6.4688ms
  MOPED: 127.0.0.1:27017 QUERY        database=development collection=buildings selector={"_id"=>BSON::ObjectId('52fb014862696b06ad100000')} flags=[] limit=0 skip=0 batch_size=nil fields=nil runtime: 8.3167ms
  MOPED: 127.0.0.1:27017 QUERY        database=development collection=users selector={"$query"=>{"_id"=>BSON::ObjectId('52fb013b62696b06ad000000')}, "$orderby"=>{:_id=>1}} flags=[] limit=-1 skip=0 batch_size=nil fields=nil runtime: 9.1527ms
Unpermitted parameters: location
default_url_options is passed options: {}

Unpermitted parameters: location
Redirected to http://bikinibottom:3000/id/buildings/52fb014862696b06ad100000/address
Completed 302 Found in 1280ms

编辑:

我将这个添加到模型中

def location=( loc )
  location = eval(loc)
end

完全没有错误,但没有保存位置

【问题讨论】:

  • 你在哪里打电话building_params?此外,您正在传递一个字符串,但允许一个数组。
  • 应该只是params.require(:building).permit(:address, :location)
  • @sevenseacat 在更新操作中,我已经更新了我的问题。我不知道如何将其解析为 Model 中定义的数组

标签: ruby-on-rails ruby-on-rails-4


【解决方案1】:

查看传递给控制器​​的参数,似乎“位置”属性作为字符串而不是数组传递,
参数:{"utf8"=>"✓", "authenticity_token"=>"j/n8Sv1CmEf5LKQMjNb7iQndJjDzWqkxsGrVIdS6i54=", "building"=>{"location"=>"[112.75631079999994,-7.272195699999999]", "address"=>" Jalan Dharmawangsa"}, "commit"=>"Simpan", "locale"=>"id", "id"=>"52fb014862696b06ad100000"}

为了验证参数 'building[location]' 包含字符串数据的事实,打印 params[:building][:location] 的类,它应该打印 String

如果参数以字符串形式传递(如上面的参数传递所示),则将代码更改为以下代码:

def building_params
  params.require(:building).permit(:address, :location)
 end

【讨论】:

  • 现在我得到了错误页面Mongoid::Errors::InvalidValue in BuildingsController#update。我想我必须将字符串解析为模型中定义的数组,但我不知道如何
【解决方案2】:

我的建议是您应该将参数作为数组发送,如下代码所示:

<input id="building_location" name="building[location]" type="text" value=[112.70665740967, -7.26961135864] />

并将构建参数代码重新转换回

def building_params
  params.require(:building).permit(:address, :location => [])
end

或者如果你不能这样做,你必须解析参数'building[location]',如下面的代码所示

def building_params
  params[:building][:location] = params[:building][:location][1..-2].split(',') unless params[:building][:location].blank?
  params.require(:building).permit(:address, :location => [])
end

【讨论】:

  • 我仍然从您的第二个代码中得到“未经许可的参数:位置”,但不像我的问题那样两次,仍然是最后一个
  • 我编辑的问题怎么样,如果你有任何建议
  • 是否保存甚至调用您的代码“位置=”?您可以打印日志或在该函数中添加一些语句吗?关于之前的问题,我已经更新了我之前的答案。
  • 是的,它被称为,我输入“puts 'hello'”并在控制台中打印。我怎样才能在文本字段中有这样的数组值?目前我只写= f.text_field :location
  • 你的新答案仍然产生 Unpermitted parameters: location like before
【解决方案3】:

[OP 的解决方案粘贴在下面作为答案]

我在这里找到了答案。正如您在我的服务器日志中看到的,有两个 Unpermitted parameters: location,因为我在更新操作(第 2 行和第 4 行)中调用了两次 building_params

我将第 2 行更改为 ret = params[:building].has_key?(:address) ... 并应用 @sanjiv 的解决方案后,问题仍然存在。

输入值是字符串中的"[112.75631079999994,-7.272195699999999]",基于@sanjiv 的解决方案:

params[:building][:location][0] = "[112.75631079999994"
params[:building][:location][1] = "-7.272195699999999]"

注意括号。然后我通过以下方式修复它:

def building_params
  params[:building][:location] = eval(params[:building][:location])
  params.require(:building).permit(:address, :location => [])
end

eval() 使您可以从带括号的字符串转换为数组。但是为什么我不能做这个呢?

# controller
def building_params
  params.require(:building).permit(:address, :location)
end

# model
def location=( loc )
  location = eval(loc)
end

如果:location 是数组,rails 是否已经在控制器中知道?服务器日志中没有错误消息

【讨论】:

    猜你喜欢
    • 2013-07-25
    • 2013-08-01
    • 2023-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-11
    相关资源
    最近更新 更多