如何将表单值(含单选按钮)传入Rails控制器?Ruby新手求助
嘿,刚接触Ruby on Rails遇到表单问题太正常了,我来帮你一步步搞定!
首先,先指出你代码里的一个小问题:你给两个单选按钮都加了checked: true,这会导致页面加载时两个选项都被选中,但单选按钮本来应该是同一组只能选一个的,浏览器处理这种情况可能会出现异常。所以你需要把其中一个的checked: true去掉,只留一个作为默认选项,或者都不设置(让用户自己选)。
修正后的表单代码应该是这样的:
<div class="col-md-10"> <%= f.radio_button :recipients, 'Resources', checked: true %> Resources<br /> <%= f.radio_button :recipients, 'Organisations' %> Organisations<br /> </div>
这里解释下:f.radio_button的第一个参数:recipients是对应你模型里的属性名,第二个参数是这个单选按钮的具体值。因为两个单选按钮都用了:recipients作为第一个参数,Rails会自动把它们归为同一组,用户只能选中其中一个。
接下来分几步确保值能正确传到控制器和模型:
1. 确保模型有对应的字段
首先要确认你的模型(比如假设是Notification或者你实际的模型名称)里有recipients这个字段。如果还没有,需要生成迁移来添加:
rails generate migration AddRecipientsTo[你的模型名] recipients:string rails db:migrate
把[你的模型名]换成你实际的模型,比如Message、Request之类的。
2. 在控制器里配置强参数
Rails有个安全机制叫强参数,必须明确允许接收的参数,不然会被拒绝。在你的控制器对应的动作(比如create或update)里,要把:recipients加入允许的参数列表:
def create @your_model = YourModel.new(your_model_params) if @your_model.save redirect_to @your_model, notice: '数据保存成功!' else render :new end end private def your_model_params # 把YourModel换成你的模型名,其他属性根据你的表单补充 params.require(:your_model).permit(:recipients, :title, :content) end
这样当用户提交表单时,选中的单选按钮值就会通过params[:your_model][:recipients]传递给模型,最终保存到数据库里。
3. 可选:添加模型验证(确保数据合法)
如果你想强制用户必须选择其中一个选项,还可以在模型里添加验证:
class YourModel < ApplicationRecord validates :recipients, presence: true, inclusion: { in: ['Resources', 'Organisations'], message: "只能选择Resources或Organisations" } end
这样如果用户没选就提交表单,会收到错误提示,表单也会重新渲染。
最后测试一下:当你选中Organisations提交表单时,你的模型实例的recipients属性就会是Organisations,控制器也能正确接收到这个值啦!
内容的提问来源于stack exchange,提问作者Mr Nash

