在过去的几天里,我一直在努力解决这个问题,非常感谢一些帮助。一个有两个模型的Rails应用程序:
在balance
处创建新的http://localhost:3000/balances/new
时,表单如下所示:
如何让用户能够同时创建多个余额?日期字段应该只有一个文本框应该用于创建的所有余额记录,但是表单上应该有多个帐户下拉列表和余额文本框。
我试过查找嵌套表格,但我很挣扎。
CODE
模式
create_table "accounts", force: :cascade do |t|
t.string "name"
t.boolean "credit"
t.boolean "active"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
end
create_table "balances", force: :cascade do |t|
t.decimal "balance"
t.date "date"
t.integer "account_id"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
end
account.rb
class Account < ActiveRecord::Base
has_many :balances
validates :name, presence: true, length: { maximum: 250 },
uniqueness: { case_sensitive: false }
end
balance.rb
class Balance < ActiveRecord::Base
belongs_to :account
#default_scope -> { order(date: :desc) }
validates :account, presence: true, length: { maximum: 250 }
end
accounts_controller.rb
....
def new
@account = Account.new
end
def create
@account = Account.new(account_params)
respond_to do |format|
if @account.save
format.html { redirect_to accounts_path, notice: 'Account was successfully created.' }
format.json { render :show, status: :created, location: @account }
else
format.html { render :new }
format.json { render json: @account.errors, status: :unprocessable_entity }
end
end
end
....
balances_controller.rb
....
def new
@balance = Balance.new
end
def create
@balance = Balance.new(balance_params)
respond_to do |format|
if @balance.save
format.html { redirect_to balances_path, notice: 'Balance was successfully created.' }
format.json { render :show, status: :created, location: @balance }
else
format.html { render :new }
format.json { render json: @balance.errors, status: :unprocessable_entity }
end
end
end
....
余额/ _form.html.erb
<%= form_for(@balance) do |f| %>
<% if @balance.errors.any? %>
<div id="error_explanation">
<h2><%= pluralize(@balance.errors.count, "error") %> prohibited this balance from being saved:</h2>
<ul>
<% @balance.errors.full_messages.each do |message| %>
<li><%= message %></li>
<% end %>
</ul>
</div>
<% end %>
<div class="field">
<%= f.label :date %><br>
<%= f.text_field :date %>
</div>
<div class="field">
<%= f.label :account_id %><br>
<%= f.collection_select(:account_id, Account.all.where(active: true).order('name ASC'), :id, :name,{})%>
</div>
<div class="field">
<%= f.label :balance %><br>
<%= f.text_field :balance %>
</div>
<div class="actions">
<%= f.submit %>
</div>
<% end %>
答案 0 :(得分:1)
所以,在我看来,你的挑战有两个部分。
我不打算详细介绍。希望这会指出你正确的方向......
在您的余额表单上,使用form_tag
代替form_for
,这样您就可以代表多个余额(而不是绑定到单个余额实例)。创建余额部分(包括帐户名称(作为纯文本,而不是下拉列表),余额输入和account.id隐藏字段)。使用余额部分迭代所有活动帐户,以创建适当的输入。日期字段将位于迭代器之外,以便您获得一个日期输入。你可以摆弄所有这些,这样你的余额都会以一个参数哈希结束。
在您的控制器中,获取余额的参数哈希值,然后对其进行迭代,以使用每个新余额的一个日期值创建余额。
我知道这是非常高的水平。我道歉但是,写出所有代码的时间远远超过我现在的时间。希望这可以帮助您实现这一目标。