2015-04-06 36 views
0

在模型上,我有attr_accessor: :email_settings为什么这个表单助手会生成两个输入?

在视图中,我有:

<%= form_for some_model do |f| %> 
    <%= f.fields_for :email_settings do |email_settings| %> 
     <%= email_settings.label :general, _("General updates") %> 
     <%= email_settings.check_box :general %> 
     General site updates 
    <% end %> 
<% end %> 

但在HTML,这并不为some_model[email_settings][general]创建一个输入,它创建了两个。一个隐藏和一个复选框:

<label for="user_email_settings_general">General updates</label> 
<input name="user[email_settings][general]" type="hidden" value="0"> 
<input id="user_email_settings_general" name="user[email_settings][general]" type="checkbox" value="1"> 
General site updates 

这是怎么回事?为什么有一个隐藏的输入和一个复选框为相同的值,当我只想要一个复选框?

此外,该表单被提交到控制器动作,我这样做:

def update 
    puts "email_params: #{email_params}" 
end 

def email_params 
    params.require(:user).permit(:email_settings) 
end 

,输出:

Unpermitted parameters: email_settings 
email_params: {} 

不知道email_settings是如何被解释为“不允许的”当我明确地允许它。

+0

'params.inspect'的输出是什么? – 2015-04-06 09:51:25

+0

我不得不将'def email_params'改为:'params.require(:user).permit(email_settings:[:general])' – cilphex 2015-04-06 09:59:47

回答

1

从浏览器应始终发送回复。 如果你没有选择框,将发送隐藏字段,以了解已发送的内容。

通过这种方式,滑轨总是会收到一个指示,表明已选中该框。

类似答案在这里:Why does the check_box form helper generate two checkboxes, one hidden?

+0

但是这不能按预期工作,因为*两个*值被指定而不是一个,使'user [email_settings] [general]'本身被解释为一个'[0,1]'而不是'0'或'1'的数组。 – cilphex 2015-04-06 09:32:40

+0

正确。上面的评论是错误的。但还有一个问题,我会更新主帖子。 – cilphex 2015-04-06 09:38:03

+0

email_setings是一个数组。 尝试放入您的模型 'serialize:email_setings,Array' 和您的控制器'params.require(:user).permit!'以查看它是否通过 – AntonyFalegk 2015-04-06 09:57:48

相关问题