如何使用单个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
答案 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')
则无效。
如果你想确保它们全部保存,我还会考虑将它包装在一个交易中。