rails参数空白或错误

时间:2014-09-05 14:37:06

标签: ruby-on-rails ruby strong-parameters

我尝试了所有东西,但是在“新的”方法中,不能在轨道上制作这种红宝石的正面或反面。

def edge_params
    params.require(:edge).permit(:kind, :start_id, :end_id, :property1)
end

这样参数最终会出现在'Edge.save(edge_params)'方法中,但':start_id'和':end_id'都是指向节点的外键。

def edge_params
  params.require(:edge).permit(:kind, :start_id, :end_id, :property1)
    p = { 
                :kind => params[:kind],
                :start_id => Node.where("nodeid = ?", params[:start_id]).first,
                :end_id => Node.where("nodeid = ?", params[:end_id]).first,
            :property1 => params[:property1]
        }
end

这会执行,但总是失败,抱怨所有必需的(验证kind的存在,start / end_id)是空白的。我在这里做错了。 我需要以某种方式找到节点ID,因为否则我得到了预期的节点但得到了字符串错误。 我是Ruby的新手,它比看起来要困难得多,因为它隐含地做了很多事情,以至于人们并不真正知道自己在做什么。但它需要一个.save方法的ruby哈希,就像我想象的那样。

我也不完全了解要求许可部分。我从rails页面上的教程中得到了这个。 将     params.require(:edge => [:kind,:start_id,:end_id])。permit(:property1) 也是因为这对我的数据更有逻辑意义。

其他信息

class Edge < ActiveRecord::Base
  belongs_to :start_id, :class_name => 'Node', :foreign_key => "start_id", :primary_key => "nodeid"
  belongs_to :end_id, :class_name => 'Node', :foreign_key => "end_id", :primary_key => "nodeid"
  validates :kind, presence: true
  validates :start_id, presence: true
  validates :end_id, presence: true
end

class Node < ActiveRecord::Base
    has_many :start_id, :class_name => 'Edge', :foreign_key => "start_id" , :primary_key => "nodeid"
    has_many :end_id, :class_name => 'Edge', :foreign_key => "end_id", :primary_key => "nodeid"
    validates :nodeid, presence: true, uniqueness: true, length: { minimum: 2 }
end

<%= form_for @edge do |f| %>
   <p>
      <%= f.label :kind %><br>
      <%= f.text_field :kind %>
    </p>
    <p>
      <%= f.label :start_id %><br>
      <%= f.text_field :start_id %>
    </p>
   <p>
      <%= f.label :end_id %><br>
      <%= f.text_field :end_id %>
    </p>
    <p>
      <%= f.label :propety1 %><br>
      <%= f.text_field :property1 %>
    </p>

1 个答案:

答案 0 :(得分:1)

首先你的课程似乎有点试试这个

class Edge < ActiveRecord::Base
  belongs_to :start_node, :class_name => 'Node', :foreign_key => "start_id", :primary_key =>"nodeid"
  belongs_to :end_node, :class_name => 'Node', :foreign_key => "end_id", :primary_key =>"nodeid"
  validates :kind, presence: true
  validates :start_id, presence: true
  validates :end_id, presence: true
end

class Node < ActiveRecord::Base
   has_many :start_edges, :class_name => 'Edge', :foreign_key => "start_id", :primary_key =>"nodeid"
   has_many :end_edges, :class_name => 'Edge', :foreign_key => "end_id", :primary_key =>"nodeid"
   validates :nodeid, presence: true, uniqueness: true, length: { minimum: 2 }
end

为什么要在需要之后构建Hash?这应该工作正常。

def create
   @edge = Edge.new(edge_params)
   if @edge.save
     redirect_to edge_path(@edge)
   else
     render 'new'
   end
end
private
   def edge_params
     params.require(:edge).permit(:kind,:start_id,:end_id,:property1)
   end

无需将节点作为实际Node对象提交。该关联通过ORM(对象关系映射)在模型中进行。当您致电@edge.start_node时,它将执行类似

的查询
"SELECT nodes.* FROM nodes where nodes.nodeid = THIS EDGES START_ID" 

此外,我确信您使用nodeid代替标准id列是有原因的,但我不推荐它。我会改变这样的联想。

class Edge < ActiveRecord::Base
  belongs_to :start_node, :class_name => 'Node', :foreign_key => "start_id"
  belongs_to :end_node, :class_name => 'Node', :foreign_key => "end_id"
  validates :kind, presence: true
  validates :start_id, presence: true
  validates :end_id, presence: true
end

class Node < ActiveRecord::Base
   has_many :start_edges, :class_name => 'Edge', :foreign_key => "start_id"
   has_many :end_edges, :class_name => 'Edge', :foreign_key => "end_id"
   validates :nodeid, presence: true, uniqueness: true, length: { minimum: 2 }
end

然后EdgeNode将通过名为id的增量列关联,默认情况下会在Rails个表中构建。原因是如果您允许用户更改nodeid上的Node,它会将关联链断开至Edge,而使用id nodeid可以改变,但它的关系保持不变。

我还建议您更改表单以使用选择框,因为您现在没有验证Node的存在,但这似乎是一个单独的问题。

要在评论中回答你的问题,我会使用这样的观点。

<%= form_for @edge do |f| %>
  <p>
    <%= f.label :kind %><br>
    <%= f.text_field :kind %>
  </p>
  <p>
    <%= f.label :start_id %><br>
    <%= collection_select(:edge,:start_id,Node.all,:id,:nodeid) %>
  </p>
  <p>
    <%= f.label :end_id %><br>
    <%= collection_select(:edge,:end_id,Node.all,:id,:nodeid)  %>
  </p>
  <p>
    <%= f.label :propety1 %><br>
    <%= f.text_field :property1 %>
  </p>
  <%= f.submit %>
<% end %>