【问题标题】:How to use Strong_Parameters in Rails 4 with Mongoid, if it throws Unpermitted parameters: (model_name) error on nested attributes如何在带有 Mongoid 的 Rails 4 中使用 Strong_Parameters,如果它抛出 Unpermitted parameters: (model_name) error on nested attributes
【发布时间】:2014-10-21 04:35:07
【问题描述】:

我正在尝试通过使用带有 Rails 4.1.6 的 Mongoid 在 MongoDB 中使用嵌入式关系。我在我的用户模型中嵌入了一组位置数据,因为我将在每 5 分钟间隔后添加用户的位置。

这个问题是:
我可以使用 IRB 或 Mongo Shell 将数据添加到我的数据库中。但是当我使用我的应用程序前端时,它不会传递嵌入的属性。最终文档只包含用户名,这是用户模型的字段。

我尝试将 user_params 放入 consol 然后我看到以下错误:

在 2014-10-21 05:04:04 +0100 为 127.0.0.1 开始 POST "/users" 由 UsersController#create 作为 HTML 处理 参数:{"utf8"=>"✓", "authenticity_token"=>"S5QKXuzEZID7eEjfhVWcYyLjEpi+Y3NVWt9cy/aEKOc=", "user"=>{"name"=>"Appuvaa4", "coord"=>{"lat" =>“40.23”、“long”=>“33.33”、“alt”=>“33.22”}}、“commit”=>“创建用户”} 不允许的参数:坐标


不允许的参数:坐标 {"name"=>"Appuvaa4"}


我不明白为什么它说 Unpermitted parameters: coord,但是我使用了 rails strong_parameters 如下。

请让我知道我的代码有什么问题。

我还阅读了 MongoDB 中的地理空间数据存储,这看起来很棒。如果有人可以指导我有关如何使用嵌入式文档存储地理空间数据的任何参考或链接,我真的会很高兴。因此,我将使用地理空间数据存储,而不是像这样存储数据,因为稍后我还将对存储的数据实施算法。

我想这个问题只和Strong_parameters有关,所以如果我在解决这个问题后把它改成mongos Geospatial就没有问题了。

`私人 定义用户参数

   params.require(:user).permit(:name, 
                               :coords_attributes => [:lat, 
                                                      :long,:alt])

#I also Tried this 

params.require(:user).permit(:name, {:coords => [:lat, :long, :alt])
end `                                                        

但是,这两种方法都不适合我。 以下是我的其余代码:

用户控制器

   class UsersController < ApplicationController
  before_action :set_user, only: [:show, :edit, :update, :destroy]


  def index
    @users = User.all
  end

  def show
    @users = User.all
  end

  def new
    @user = User.new
  end

  def edit
  end

  def create

    @user = User.new(user_params)
    puts '**********************************************'
    puts user_params

    puts '*****************************************'

    respond_to do |format|
      if @user.save
        format.html { redirect_to @user, notice: 'User was successfully created.' }
        format.json { render :show, status: :created, location: @user }
      else
        format.html { render :new }
        format.json { render json: @user.errors, status: :unprocessable_entity }
      end
    end

  end




  private
    # Use callbacks to share common setup or constraints between actions.
    def set_user
      @user = User.find(params[:id])
    end

    def user_params

        params.require(:user).permit(:name, 
                                   :coords_attributes => [:lat, 
                                                          :long, 
                                                          :alt])
    end

end

用户.rb

    class User
  include Mongoid::Document
  include Mongoid::Attributes::Dynamic

  field :name


  embeds_many :coords, class_name: "User"
  #embeds_many :locations

  accepts_nested_attributes_for :coords
   #accepts_nested_attributes_for :locations


end

坐标.rb

   class Coord
  include Mongoid::Document
  field :lat
  field :long 
  field :alt

  embedded_in :user, :inverse_of => :coords

end

_form.html.erb

    <%= form_for(@user) do |f| %>
  <% if @user.errors.any? %>
    <div id="error_explanation">
      <h2><%= pluralize(@user.errors.count, "error") %> prohibited this user from being saved:</h2>

      <ul>
      <% @user.errors.full_messages.each do |message| %>
        <li><%= message %></li>
      <% end %>
      </ul>
    </div>
  <% end %>

  <div class="field">
    <%= f.label :name %><br>
    <%= f.text_field :name %>
  </div>

  <h3>Co-ordinates</h3>
  <%= f.fields_for :coord do |c| %>

    <div class="field">
    <%= c.label :Latitude %><br>
    <%= c.text_field :lat %>
  </div>
    <div class="field">
    <%= c.label :Longitude %><br>
    <%= c.text_field :long %>
  </div>
  <div class="field">
    <%= c.label :Altitude %><br>
    <%= c.text_field :alt %>
  </div>
  <% end %>

  <div class="actions">
    <%= f.submit %>
  </div>
<% end %>

【问题讨论】:

  • 你能试试这个吗:params.require(:user).permit(:name,:coords)
  • 我试过了,但结果还是一样。未经许可:坐标
  • 你解决了吗?尝试传递 :id 以及:params.require(:user).permit(:name, :coords_attributes =&gt; [:id,:lat, :long,:alt])
  • 否 @Ali 它仍然不起作用。如果我想要下面的文件,你能建议我应该如何设计我的模型。我将通过使用用户的当前坐标不时更新位置文件。 { _id : ObjectId(...), name : "...", locations : [ { time : "timestamp" , loc : [ 55.5, 42.3 ] } , { time : "timestamp", loc : [ -74 , 44.74] } ] }

标签: ruby-on-rails mongodb mongoid geospatial strong-parameters


【解决方案1】:

我不确定您是否发布 JSON。这对我在我的问题上发布 JSON 很有用。

你有:

params.require(:user).permit(:name, 
                                   :coords_attributes => [:lat, 
                                                          :long, 
                                                          :alt])

但必须是:

params.require(:user).permit(:name, {:coords => [:lat, :long, :alt]})

这里是关于这个问题的更多信息。

https://github.com/rails/rails/blob/master/actionpack/lib/action_controller/metal/strong_parameters.rb#L246-L247

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-15
    • 1970-01-01
    相关资源
    最近更新 更多