Ruby on rails 4 将另一条记录保存到另一个表Rails中后,自动在表中创建记录4
我仍然是RoR的新手。我的任务是根据书中插入的示例的数量添加示例,知道我有一个书表和一个示例表,两者之间的关系是一本书有许多示例,一个示例属于一本书。 这是我的尝试: 在books_controller.rb中 方法创建:Ruby on rails 4 将另一条记录保存到另一个表Rails中后,自动在表中创建记录4,ruby-on-rails-4,has-many,belongs-to,Ruby On Rails 4,Has Many,Belongs To,我仍然是RoR的新手。我的任务是根据书中插入的示例的数量添加示例,知道我有一个书表和一个示例表,两者之间的关系是一本书有许多示例,一个示例属于一本书。 这是我的尝试: 在books_controller.rb中 方法创建: def create @book= Book.new(book_params) if @book.save @book.nbr_exemplaires.times do |i| @exemplaire= Exemplaire.
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
book/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>
添加新书
从现有列表中选择作者
1} ,{:name=>'book[author_id][]}%>
从现有列表中选择主题
1} ,{:name=>'book[subject_id][]}%>
var checkbox=document.getElementById('book_has_examplalies');
var details_div=document.getElementById('expl_details');
checkbox.onchange=函数(){
如果(选中此项){
细节部分样式['display']='block';
}否则{
细节部分样式['display']='none';
}
};
我将使用嵌套属性,这样rails将通过相同的表单自动为您创建它们:
class Book < ActiveRecord::Base
has_many :exemplaires
accepts_nested_attributes_for :exemplaires, allow_destroy: true
classbook
这将允许在视图中使用嵌套的表单生成器:
<%= 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将在同一个操作中自动创建所有关联对象,而无需在控制器/模型端编写额外代码。下面是一个关于它的好例子:
如果你还没有订阅,我建议你订阅。这是我开始使用rails时使用过的最有用的资源,每月只需几美元。祝你好运 那么我建议如下:
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
classbook
如果您的表中实际有一个列名“nbr\u exemplaries”,则不需要attr\u访问器行。只有当您不将其作为单独的值保存在DB中时,才可以这样做 感谢您的回复,但我真正想做的是,用户输入书籍的数量,此时会根据用户输入的数字自动将一些记录添加到示例表中