簡體   English   中英

Ruby on Rails:嵌套屬性,在單個文本區域中保存多個記錄

[英]Ruby on Rails: Nested Attributes, saving multiple records in single text area

如何使用單個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

通常,您無需太多操作即可保存參數。 如果要將text_area參數轉換為多個記錄,只需將其切碎並在控制器中進行處理即可。

假設您使用新行來描述產品,因此您的文本區域如下所示:

產品1
產品2
產品3

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') ,它將無法正常工作。

如果您想確保它們全部保存,我還將考慮將其包裝在事務中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM