无法在ror中的不同表中保存数据

时间:2017-02-09 05:33:08

标签: ruby-on-rails nested-attributes

我正在尝试使用单个表单将数据保存到不同的表中。我有两个模型。即A和B.我正在尝试使用A表单存储B的属性。我的模型是:

class A < ApplicationRecord
has_one :B
accepts_nested_attributes_for :B
end 

我的B模型是:

class B < ApplicationRecord
belongs_to :A
end

我的A控制器是:

class AController < ApplicationController

def index
    @a = A.all

end 

def new
    @a = A.new
end

def create
    @a = A.new(a_params)
    @a.b.build
    if @a.save
        redirect_to a_path
    else
        render 'new'
    end
end

private 

def a_params
    params.require(:a).permit(:name, :age, :address :b => [:fname, :phone])
end
end

我的new.html.erb是:

<%= form_for(:a, url:  a_path)  do |f| %>
<div class="field">
    <%= f.label :name %>
    <%= f.text_field :name%>
</div>
<div class="field">
    <%= f.label :age %>
    <%= f.text_field :age%>
</div>
<div class="field">
    <%= f.label :address %>
    <%= f.text_field :address%>
</div>

<%= f.fields_for :b do |f| %>
<p>
<%= f.label :fname, "father name" %><br />
<%= f.text_field :fname %>
  </p>
      <p>
      <%= f.label :phone, "phone" %><br />
   <%= f.text_field :phone %>
  </p>
   <% end %>
<div class="actions">
    <%= f.submit %>
</div>

我无法在两个表中存储数据。即输入的数据存储在A表中但未能存储在B表中。

2 个答案:

答案 0 :(得分:0)

有些事情似乎错了:

1)您没有正确使用强参数,它应该是

   params.require(:a).permit(:name, :age, :address, :b_attributes => [:fname, :phone])

2)你可以删除

    @a.b.build

b记录的关联和保存应该立即通过rails完成。

答案 1 :(得分:0)

The build method signature is different for  has_one and 

has_many关联的构建语法:

@a.b.build

has_one关联的构建语法:

@a.build_b  # this will work

@a.b.build  # this will throw error




class AController < ApplicationController

    def index
        @a = A.all

    end 

    def new
        @a = A.new
    end

    def create
        @a = A.create(a_params)
        @a.build_b
        if @a.save

          redirect_to a_path
        else
            render 'new'
        end
    end

    private 

    def a_params
        params.require(:a).permit(:name, :age, :address, :b_attributes => [:fname, :phone])
    end
end

它在我的本地机器上运行良好。