2014-02-13 53 views
0

我按照此Rails 4 Unpermitted Parameters for Array但它不适用于我。这里是我的模型Rails 4坐标数组的未经允许的参数

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 

没有错误可言,但位置不保存

+0

你在哪里调用'building_params'?此外,你传递一个字符串,但允许一个数组。 – sevenseacat

+0

它应该只是'params.require(:building).permit(:address,:location)' –

+0

@sevenseacat在更新操作中,我更新了我的问题。我不知道如何将它解析为模型 – spondbob

回答

0

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

用于验证参数“建筑[位置]”包含的字符串数据的事实,打印类则params的[:建筑] [:位置]和它应该打印字符串

如果参数作为字符串传递(如在上述参数通过看到的),然后更改代码如下代码:

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

中定义的数组,现在我在'BuildingsController#update'中出现了错误页'Mongoid :: Errors :: InvalidValue。我想我必须解析字符串作为模型中定义的数组,但我不知道如何 – spondbob

0

我暗示将是您应发送参数作为阵列示于下面的代码:

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

和重新转换回建设第MS代码回到

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

或者,如果你不能做到这一点,他们必须解析PARAMS“建设[位置]”如下面的代码所示

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

从您的第二个代码仍然有“未经许可的参数:位置”,但不是我的问题两次,仍然是最后一个 – spondbob

+0

那么我编辑的问题,如果你有任何建议 – spondbob

+0

保存甚至调用你的代码“位置=”?你可以打印你的日志,或者在该函数中添加一些声明吗?关于前面的问题,我已经更新了我以前的答案。 – Sanjiv

0

[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是否已经知道控制器?服务器日志中没有错误消息