Я пришел, чтобы искать вашу коллективную мудрость.
Моя цель, обзор:
Чтобы лучше управлять компьютерами для разных клиентов, я пытаюсь расширить панель инструментов Puppet . Это приложение на Rails 2, и я пытаюсь расширить его с помощью приложения на Rails 3, которое я пишу. Есть несколько проблем, которые делают Dashboard менее чем идеальным для моих нужд, но решения просты. Я собираюсь сосредоточиться на одном, потому что я чувствую, что ответ на этот вопрос поможет мне понять остальное. Я искал решения, которые вообще не изменяют код панели инструментов, потому что я не сопровождающий и не хочу в будущем создавать беспорядок.
Я много думал о том, как сделать это лучше всего. Я думал о подключении непосредственно к базе данных, но я немного похолодел после небольшого поиска в Google. Похоже, что установка второго соединения с базой данных не так уж и сложна, мне не нравится изменять базу данных другого приложения во время его работы. Пожалуйста, скажите что-нибудь, если я отказываюсь от совершенно разумного варианта, основанного на суеверии.
Было несколько других идей, но одна из них, с которой я наконец-то начал, и которая имела незначительный успех, - это доступ к базе данных Dashboard через REST. Он встроен, почему бы не использовать его? Ну, я смог манипулировать парой столов, но не той, которую хотел. Таким образом, в этой ситуации следует помнить о трех таблицах.
- узлы (в основном компьютеры)
- 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, и я даже могу создать модель Rails 3, которая не подходит для node_group_memberships, но я не могу ничего создать в этой таблице. Я вижу, смотрю ли я на контроллер 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 жалких часов на то, чтобы понять это. Спасибо!