我尝试了所有东西,但是在“新的”方法中,不能在轨道上制作这种红宝石的正面或反面。
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>
答案 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
然后Edge
和Node
将通过名为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 %>