我来寻求你的集体智慧。
我的目标是一个概述:为了更好地管理各种客户的计算机,我正在尝试扩展 Puppet 的Dashboard。这是一个 Rails 2 应用程序,我正在尝试使用我正在编写的 Rails 3 应用程序来扩展它。有一些问题使 Dashboard 无法满足我的需求,但解决方案很简单。我将专注于一个,因为我觉得这个问题的答案将帮助我弄清楚其余的问题。我一直在寻找根本不改变仪表板代码的解决方案,因为我不是维护者,也不想让未来变得一团糟。
我想了很多关于如何做到最好。我曾想过直接插入数据库,但在谷歌上搜索了一下后我就冷落了。似乎建立第二个数据库连接并不难,我不喜欢的是在另一个应用程序运行时更改它的数据库。如果我基于迷信放弃了一个完全合理的选择,请说些什么。
还有一些其他的想法,但我最终开始并取得了一定成功的想法是通过 REST 访问 Dashboard 的数据库。它是内置的,为什么不使用它?好吧,我能够操纵几张桌子,但不是我想要的那张。所以在这种情况下需要注意三个表。
- 节点(基本上是计算机)
- node_groups(您可以将计算机放入的组)
- node_group_memberships(将 1 和 2 相互关联的连接表)
我可以添加和删除两个节点和 node_groups,但我也希望能够在两者之间创建连接。为了创建一个新用户,我设置了一个如下所示的 ActiveResource 模型:
class PuppetNode < ActiveResource::Base
self.site = "http://127.0.0.1:4000/"
self.element_name = "node"
attr_accessor :grouped
end
然后我可以自由地创建新节点,或者通过控制台从节点表中获取信息。它可能看起来像这样:
PuppetNode.create(:column_name => "and so on")
node_groups 也是如此,我什至可以创建一个不适合 node_group_memberships 的 Rails 3 模型,但我无法在该表中创建任何内容。如果我查看 Rails 2 node_group_membership 控制器(由 Puppet Labs 的好人提供),我可以看到有一个 create 方法
class NodeGroupMembershipsController < InheritedResources::Base
respond_to :json
before_filter :raise_if_enable_read_only_mode, :only => [:new, :edit, :create, :update, :destroy]
before_filter :standardize_post_data, :only => [:create]
def create
create! do |success, failure|
success.json { render :text => @node_group_membership.to_json, :content_type => 'application/json', :status => 201 }
failure.json { render :text => {}.to_json, :content_type => 'application/json', :status => 422 }
end
end
# we want: {node_group_membership => {node_id => <id>, node_group_id => <id>}
# allow and convert: {node_name => <name>, group_name => <name>}
def standardize_post_data
unless params[:node_group_membership]
params[:node_group_membership] = {}
node = Node.find_by_name(params[:node_name])
group = NodeGroup.find_by_name(params[:group_name])
params[:node_group_membership][:node_id] = (node && node.id)
params[:node_group_membership][:node_group_id] = (group && group.id)
end
end
end
但无论出于何种原因,每次我尝试与这样的东西建立关联时,它都会窒息
irb(main):005:0> PuppetNodeGroupMembership.create(:node_id => 20, :node_group_id => 5)
=> #<PuppetNodeGroupMembership:0x007fb3150af878 @attributes={"node_id"=>20, "node_group_id"=>5}, @prefix_options={}, @persisted=false, @remote_errors=#<ActiveResource::ResourceInvalid: Failed. Response code = 422. Response message = .>, @validation_context=nil, @errors=#<ActiveResource::Errors:0x007fb3150af4e0 @base=#<PuppetNodeGroupMembership:0x007fb3150af878 ...>, @messages={}>>
任何建议都将不胜感激,我已经花了 8 个痛苦的小时来试图弄清楚。谢谢!