Rails:param丢失或值为空,因为param显示为“#<edge:0xb2535b8>”</edge:0xb2535b8>

时间:2014-11-12 18:03:52

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

我正在使用表单,控制器中表单的名称显示为“#”,但我希望它显示为:edge。

这是我的控制器:

  def new
      #some_stuff
      @edge = Edge.new
      #some_stuff
  end

  def create
    @edge = Edge.new(edge_params)
    @edge.save
  end

  def edge_params
    params.require(:edge).permit(:location_1_id, :location_2_id)
  end

查看:

<%= form_for( :edge, :url => {:action => 'create'}) do |f| %>
  <ul>
    <li>
      <%= f.label :location_1_id %>
      <%= collection_select(@edge, :location_1_id, @location, :id, :record_as_string) %>
    </li>
    <%= submit_tag(t(:create_edge)) %>
  </ul>
<% end %>

Param req:

  

{“utf8”=&gt;“✓”,“authenticity_token”=&gt;“blah”,   “#”=&gt; {“location_1_id”=&gt;“91”,“location_2_id”=&gt;“92”},   “commit”=&gt;“创建边缘”,“动作”=&gt;“创建”,   “controller”=&gt;“admin / edges”,“floor_map_floor_id”=&gt;“1”}

所以参数的名称应该是:edge但它是我无法访问的对象。

有谁能告诉我我错过了什么? 任何帮助表示赞赏。

1 个答案:

答案 0 :(得分:1)

您应该使用收藏集上的表单块

<%= f.collection_select(:location_1_id, @location, :id, :record_as_string) %>

(注意你在块变量f上调用collection_select,而不是将@edge作为第一个参数传递)。

此外,因为您要在新的(@edge = Edge.new)中创建对象,所以您应该在表单中使用,就像这样

<%= form_for( @edge, :url => {:action => 'create'}) do |f| %>

(虽然使用:edge并不是导致问题的原因,但我怀疑是因为您在同一表单中使用:edge@edge。您需要保持一致,使用一个或另一个)