我仍然是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>
答案 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中的单独值时。