在其他表栏中保存其他记录后,自动在表中创建记录4

时间:2014-10-31 16:23:03

标签: ruby-on-rails-4 has-many belongs-to

我仍然是RoR的新手。我的任务是根据以书的形式插入的示例的数量来添加示例,知道我有书表和示例表,并且其间的关系是书籍has_many示例和示例性属于书籍。 这是我的尝试:

book_controller.rb中的

方法创建:

 def create
    @book= Book.new(book_params)

     if @book.save
      @book.nbr_exemplaires.times do |i|
        @exemplaire= Exemplaire.create(book_id:  @book.id, state: 0 )
      end

      flash[:notice]='goood'
      redirect_to admin_manage_path
     else
       flash[:alert]='ouups'
       redirect_to root_url
     end
  end



  private

   def book_params
     params.require(:book).permit(:title, :pages, :resume,:nbr_exemplaires, :has_exemplaires,       :author_ids =>[], :subject_ids =>[])
    end

书/ new.html.erb:

<h1>Add new book</h1>
          <%= form_for(@book) do |form| %>
          <div> <%= form.label :title %><br>
            <%= form.text_field :title %>
     </div>
     <div>
       <%= form.label :pages %><br>
       <%= form.number_field :pages %>
      </div>
      <div>
         <%= form.label :resume %><br>
         <%= form.text_area :resume %>
      </div>
      <div>
       <p>select author from existing list</p><br>
         <%= form.collection_select :author_ids, @authors, :id, :l_name, {:selected => 1}, {:name => 'book[author_ids][]'} %>

     </div>
      <div>
         <p> Select subject from existing list</p><br>
           <%= form.collection_select :subject_ids, @subjects, :id, :name, {:selected =>1}, {:name => 'book[subject_ids][]'} %>
      </div>
      <div>
        <%= form.label :has_exemplaires? %>
         <%= form.check_box :has_exemplaires,{}, 'Yes', 'No'%>
           <div id="expl_details" style="display:none;">
            <%= form.label :nbr_exemplaires %> <%= form.number_field :nbr_exemplaires %>

          </div>
         </div>
         <%= form.submit "Submit" %>
       <% end %>
       <script type="text/javascript">
         var checkbox = document.getElementById('book_has_exemplaires');
         var details_div = document.getElementById('expl_details');
         checkbox.onchange = function() {
           if(this.checked) {
              details_div.style['display'] = 'block';
           } else {
             details_div.style['display'] = 'none';
           }
          };
         </script>

2 个答案:

答案 0 :(得分:0)

我会使用嵌套属性,rails会通过相同的表单自动创建它们:

class Book < ActiveRecord::Base
  has_many :exemplaires
  accepts_nested_attributes_for :exemplaires, allow_destroy: true

这将允许在视图中使用嵌套表单构建器:

<%= form_for(@book) do |form| %>

  <div><%= form.label :title %><br>
       <%= form.text_field :title %>
  </div>

  <%= form.fields_for :exemplaires do |f| %>
     <%= f.text_field :name %>
     ... more fields
  <% end %>

然后,您可以添加一些javascript来创建多个嵌套表单:

<%= link_to_add_fields "Add Exemplarie", f, :answers %>

通过这种设置,rails将在同一操作中自动创建所有关联对象,而控制器/模型端没有其他代码。这是一个伟大的轨道广播:

http://railscasts.com/episodes/196-nested-model-form-revised

如果您还没订阅,我建议您这样做。它是我在开始时使用过的最有用的rails资源,每月只花费几美元。祝你好运!

答案 1 :(得分:0)

然后我建议这样的事情:

class Book < ActiveRecord::Base
  has_many :exemplaires

  attr_accessor :nbr_exemplaires
  after_save :create_exemplaires

  private 

  def create_exemplaires
    nbr_exemplaires.times do
        self.exemplaires.create()
    end
  end

如果您的表中实际上有一个列名'nbr_exemplaires',则不需要attr_accessor行。只有当您不将其保存为DB中的单独值时。