在Rails 4中使用单个表单保存多个记录
我有一个名为Family的模型,它属于User用户我想让用户在单个表单中添加多个家庭成员,这位于/views/families/new.html.erb
编辑:对不起,我应该在稍微修改代码后提供更详细的代码
在routes.rb资源中:系列编辑:在User.rb中
class User < ActiveRecord::Base has_many :families end
编辑:在Family.rb
class Family < ActiveRecord::Base belongs_to :user end
在FamiliesController中
def new end
编辑:我已经这样修改了表单:
Family Member # :
编辑:在FamiliesController中创建动作
def create @family = Family.new(family_params) a = params[:family][:"0"] @family.user_id = current_user.id if @family.save flash[:notice] = params[:family][:"0"] redirect_to dummy_path else flash[:notice] = "didnt happen" end end
- 因此,用户可以看到一个表单,用于为一个user_id创建3个系列成员
- 将数据输入3个相同的表单,然后点击提交
- 来自3个单独表单的数据应该在提交一次时在数据库中保存为3个不同的记录
编辑:我正在使用强大的参数,如下所示:
def family_params params.require(:family).permit(:all) end
-
现在,当我提交表单时,db中的所有值都保存为NULL。
-
我究竟做错了什么? 我不应该使用powershell的参数吗?
您想使用nested forms
。 您应该能够复制并粘贴以下代码以开始:
应用程序/模型/ family.rb
class Family < ActiveRecord::Base has_many :users accepts_nested_attributes_for :users end
应用程序/模型/ user.rb
class User < ActiveRecord::Base belongs_to :family end
应用程序/视图/家庭/ new.html.erb
<%= form_for(@family) do |f| %> <%= f.fields_for :users do |user| %> <%= user.text_field :name %>
<%= user.text_field :email %>
<% end %> <%= f.submit %> <% end %>
应用程序/控制器/ families_controller.rb
[...] def new @family = Family.new 3.times { @family.users.build } end [...] private # Use callbacks to share common setup or constraints between actions. def set_family @family = Family.find(params[:id]) end # Never trust parameters from the scary internet, only allow the white list through. def family_params params.require(:family).permit(:name, users_attributes: [ :name, :email ]) end
我总是这样做的方法是创建一个新的动作update_multiple
。 这需要具有以下结构的params(使用您的Family示例,并使用ID 123和456更新两个记录)
params = {:families => {123 => {:name => "foo", :address => "bar"}, 456 => {:name => "baz", :address => "qux"} }}
并且动作如下:
@families = [] params[:families].each do |id, attributes| if family = Family.find_by_id(id) family.update_attributes(attributes) @families << family end end
为了设置具有所需结构的参数,您的表单将设置如下:
<% @families.each do |family| %> <% end %>
你可以,而不是做一个新的动作,改变你的update
动作的结构来做标准代码,如果它得到参数[:family]和上面的代码,如果它得到参数[:系列]。
您需要像这样调整代码。假设您在users表中有属性name
。
在您的用户模型中
class User < ActiveRecord::Base has_many :families, :dependent => :destroy accepts_nested_attributes_for :families, :allow_destroy => true end
在您的users_controller中
def new @user = User.new @family = 3.times { @user.families.build } #here end
你的强参数应该是这样的
def user_params params.require(:user).permit(:name, families_attributes: [:name,:email]) end #users/new.html.erb <%= form_for(@user) do |f| %> <%= f.label :name %>
<%= f.text_field :name %> <%= f.fields_for :familes do |builder| %> <%= render 'family_fields', :f => builder %> <% end %> <%= f.submit %> <% end %> #users/_family_fields.html.erb <%= f.label :name, "Name" %> <%= f.text_field :name %>
<%= f.label :email, "Email" %> <%= f.text_field :email %>