新手问题 rails 表单使用多个数据库表

minix · 2012年09月10日 · 最后由 minix 回复于 2012年09月13日 · 4024 次阅读

现在有一个需求:将一个表单的内容写到两个表里面。

例如有一个表单,要填写的内容分别是 服务器 IP 地址,服务器所在地。 怎么将服务器 IP 地址写入一个数据库表,服务器所在地写到另一个数据库表里面? 只在一个表单里面实现。

http://ruby-china.org/search?q=%E5%A4%9A%E4%B8%AA%E6%95%B0%E6%8D%AE%E5%BA%93%E8%A1%A8 这个问题已经有很多回答了,直接到 model 里配置一下这个 model 的表在哪里就行了

@ywencn 谢谢! 下面是修改以后的,可以正常运行,不过不知道为什么没法写入到数据库里面 有两个模型 ip 和 sys ip

class Ip < ActiveRecord::Base
   has_many :syss
   accepts_nested_attributes_for :syss
   attr_accessible :ip_addr
 end

sys

class Sys < ActiveRecord::Base
   belongs_to :ip
   attr_accessible :ip_id, :port, :server, :status
end

下面是视图

<%= form_for @add_dev, url: { controller: "home", action: "add" } do |f| %>
  <%= f.text_field :ip_addr %>
  <%= f.fields_for :syss do |sys| %>
    <%= sys.text_field :server %>
    <%= sys.text_field :port %>
  <% end %>
  <%= f.submit "Submit" %>
<% end %>

下面是控制器

def add
   @add_dev = Ip.new
   @add_dev.syss.build
   if request.post?
     @add_dev.save
     redirect_to controller: "home", action: "index"
   end
end

不知道它为什么不将数据定到数据库里面,日志里面写

Started POST "/home/add" for 127.0.0.1 at 2012-09-11 11:40:13 +0800
Processing by HomeController#add as HTML
 Parameters: {"utf8"=>"_", "authenticity_token"=>"VNaISC/zY2KR603NUlgAQIzKsEnxs0/qrU9WxdGbqqc=", "ip"=>{"ip_addr"=>"192.168.1.1", "syss_attributes"=>{"0"=>{"server"=>"tete", "port"=>"90"}}}, "commit"=>"Submit"}
  (0.2ms)  BEGIN
 SQL (0.5ms)  INSERT INTO `ips` (`created_at`, `ip_addr`, `updated_at`) VALUES ('2012-09-11 03:40:13', NULL, '2012-09-11 03:40:13')
 SQL (1.5ms)  INSERT INTO `sys` (`created_at`, `ip_id`, `port`, `server`, `status`, `updated_at`) VALUES ('2012-09-11 03:40:13', 14, NULL, NULL, NULL, '2012-09-11 03:40:13')
  (64.4ms)  COMMIT
Redirected to http://192.168.186.129/home/index

查查 nested 之类的东西

觉得 http://ruby-china.org/topics/3213 的问题跟我差不多,不过我照他的解决方法还是没法解决问题。

@huacnlee @ywencn 只要将 fields_for 一段注释,就恢复正常。看来是 accepts_nested_attributs_for 和 fields_for 之间的问题。 谢谢你们!给了我一个解题的方向!

@huacnlee @ywencn 谢谢!问题解决了! 只要将视图改了一下就可以了。 已修改的内容:

<%= form_for @add_dev, as: 'add_dev', url: { controller: "home", action: "add" } do |f| %>
  <%= f.text_field :ip_addr %>
  <%= f.fields_for :syss do |sys| %>
    <%= sys.text_field :server %>
    <%= sys.text_field :port %>
  <% end %>
  <%= f.submit "Submit" %>
<% end %>
需要 登录 后方可回复, 如果你还没有账号请 注册新账号