我有一个表单,应该更新一个嵌套属性(承租人(用户)托管模型),但我无法获取正确的语法。
_escrow_update_form.html.erb
<%= form_for @tenant, url: tenants_escrow_path, method: :patch, validate: true do |a| %> <%= a.fields_for :escrow do |f| %> <%= f.label :new_amount_to_escrow %> <%= f.number_field(:escrow_payment) %> <% end %> <%= a.submit("Done! Go back to the Dashboard", {class: "btn btn-success btn-lg", :id=> 'goalButton'}) %> <% end %>
escrow_controller
def update @tenant = current_tenant if @tenant.escrows.update(escrow_params) redirect_to tenants_dashboard_path, notice: "Your escrow payment informaton has been updated" else redirect_to tenants_escrow_path, notice: "Your escrow payment was not updated, try again" end private def escrow_params params.permit(:escrow_payment, :home_value, :total_saved) end end
routes.rb
namespace :tenants do
resources :escrow
托管模型
class Escrow
include Mongoid::Document
#associations
belongs_to :tenant
租户模型
class Tenant
include Mongoid::Document
has_one :escrow, autosave: true, dependent: :destroy
accepts_nested_attributes_for :escrow
该模型不会更新。它给出错误“ nil:NilClass的未定义方法'update'”
答案 0 :(得分:1)
“ nil:NilClass的未定义方法'update'”
这意味着@tenant
没有任何escrow
如果_escrow_update_form.html.erb
为零,则在escrow
中构建一个@tenant.escrow
<% escrow = @tenant.escrow ? @tenant.escrow : @tenant.build_escrow %>
<%= form_for @tenant, url: tenants_escrow_path, method: :patch, validate: true do |a| %>
<%= a.fields_for :escrow, escrow do |f| %>
<%= f.label :new_amount_to_escrow %>
<%= f.number_field(:escrow_payment) %>
<% end %>
<%= a.submit("Done! Go back to the Dashboard", {class: "btn btn-success btn-lg", :id=> 'goalButton'}) %>
<% end %>
在强参数白名单中嵌套参数
def update
@tenant = current_tenant
if @tenant.update(escrow_params) #updating @tenant will automatically update the corresponding escrow
redirect_to tenants_dashboard_path, notice: "Your escrow payment informaton has been updated"
else
redirect_to tenants_escrow_path, notice: "Your escrow payment was not updated, try again"
end
end
private
def escrow_params
params.require(:tenant).permit(:escrow_payment, :home_value, :total_saved, escrow_attributes: [])
end
end