【发布时间】:2019-06-30 01:04:18
【问题描述】:
我的应用程序中有一个模型,名为 Admin。
这个Admin 可以有多个电子邮件,这些电子邮件存储在一个名为emails 的哈希中。例如,
{"sales"=>{"general"=>"sales@shop.com"},"support"=>{"general"=>"support@shop.com"}}
在创建访问这些特定电子邮件的表单时,我可以让每封电子邮件出现在输入中,但是当我尝试更新模式时,没有任何变化,因为我的 admin_params[:emails] 是 nil。
以下是我在edit.html.erb 文件中的表格:
<%= form_for @admin do |f| %>
<dt class="col-sm-10">Admin Emails</dt>
<% @admin.emails.each do |type, subtype|%>
<dt class="col-sm-10"> <%= f.label type %> </dt>
<% if @admin.emails.include?(type) %>
<% @admin.emails[type].each do |subtype_label, subtype_email| %>
<%= f.fields :emails do |field| %>
<dd class="col-sm-5"><%= field.label subtype_label %></dd>
<dd class="col-sm-5"><%= field.text_field subtype_label, :value => subtype_email %></dd>
<% end %>
<% end %>
<% end %>
<% end %>
这里是 set_admin 方法,在除 index 之外的任何其他方法之前调用:
def admin_params
params.require(:admin).permit(:name, :emails)
end
这是我的更新方法:
def update
binding.pry
@admin.update(
name: admin_params[:name],
emails: admin_params[:emails]
)
redirect_to admin_path(@admin)
end
最后,这是在特定输入上呈现的 HTML:
<input value="emails" type="text" name="admin[emails][general]" id="admin_emails_general">
知道我的问题是什么吗?一整天都在挠头。
【问题讨论】:
-
你能补充一下参数是如何在更新方法中传递的吗?
-
@joseph 你在
update方法中得到了什么参数请贴出来 -
@admin.emails.include?(type)没有意义,因为type是email哈希属性的关键 -
在代码中使用
@admin.emails[type].each不好,因为您可以使用subtype.each -
试试
params.require(:admin).permit(:name, :emails => [])
标签: ruby-on-rails hash textfield strong-parameters form-helpers