Ruby on Rails:嵌套属性,在单个文本区域中保存多个记录

时间:2015-08-21 00:51:32

标签: ruby-on-rails ruby ruby-on-rails-4

如何使用单个text_area保存具有嵌套属性的多个记录?文本框中的每一行或用逗号分隔的行应该是一个单独的记录。

控制器如何显示?

_form.html.erb

<%= simple_form_for @project do |f| %>

  <%= f.simple_fields_for :products do |g| %>
    <%= render 'product_fields', :f => g %>
  <% end%>
  <%= link_to_add_association 'add item', f, :products %>

<% end %>

_product_fields.html.erb

<%= f.text_field :category, placeholder: "Category" %>
<%= f.text_area :item, placeholder: "List your products (separated by each line or comma)" %>

project_controller.rb

def create
  @project = Project.new(project_params)

  respond_to do |format|
    format.js

    if @project.save

      format.html { redirect_to @project, notice: 'Project was successfully created.' }
      format.json { render :show, status: :created, location: @project }
    else
      format.html { render :new }
      format.json { render json: @project.errors, status: :unprocessable_entity }
    end
  end
end


def project_params
  params.require(:project).permit(
    :user_id,  
    products_attributes: [:id, :item, :hyperlink, :_destroy, :category]).merge(user_id: current_user.id)
end

我想进入我的项目表单,然后有一个大的text_area,我可以在其中添加产品列表,每个产品(由“enter”或“逗号”分隔)将是一个记录。

编辑----

添加模型:

class Project < ActiveRecord::Base
  has_many :products, dependent: :destroy
  accepts_nested_attributes_for :products, :reject_if => :all_blank, allow_destroy: true
end

class Product < ActiveRecord::Base
  belongs_to :project
end

1 个答案:

答案 0 :(得分:0)

通常你没有太多操纵就可以保存你的参数。如果你想将你的text_area param变成多个记录,只需将其删除并在控制器中处理它。

假设您使用新行描述产品,因此您的文本区域如下所示:

产品1
产品2
product3

project_params[:product_list] = "product1\nproduct2\nproduct3"
prod_arr = project_params[:product_list].split("\n")
prod_arr.each do |product|
  #you now have your product name in the local variable product
  #you can now save each one separately. You will probably
  #need to take common items of the params hash and insert the 
  #current product, then save.
end

您可以选择拆分任何角色。但选择一个有意义的,然后对你要拆分的字符串应用某种检查。请注意split("\n")使用双引号,这需要告诉Ruby您正在谈论换行符。如果您使用split('\n')则无效。

如果你想确保它们全部保存,我还会考虑将它包装在一个交易中。