【问题标题】:Checkbox selection and form object do not save复选框选择和表单对象不保存
【发布时间】:2012-02-24 14:31:50
【问题描述】:

我有一个表格,其中包括:

  • 两个复选框
  • 用于收集电子邮件地址的文本字段

我不确定这是否是最好的设计,但模型包含三个属性:

  • email_name(类型字符串)
  • send_once(布尔型)
  • send_anytime(布尔型)

如果两个复选框中的任何一个被填写,我想保存电子邮件地址,否则不保存任何内容。

一切似乎都如我预期的那样工作,但是当我查看 rails 控制台内部时,注册模型是空的。

我的日志文件是这样写的:

Started POST "/pages" for 127.0.0.1 at 2012-02-01 16:34:55 -0500
Processing by PagesController#create as HTML
Parameters: {"utf8"=>"✓",  "authenticity_token"=>"WChW/OmDPS2Td1D3x/36aCJj7V75FdiAPJ9AQvtAIS4=", "post"=>{"email_address"=>"email@examp.le", "send_once"=>"0", "send_any_time"=>"1"}, "commit"=>"Create Signup"}
(0.3ms)  BEGIN
(0.5ms)  SELECT 1 FROM "signups" WHERE "signups"."email_address" = '' LIMIT 1
(0.3ms)  ROLLBACK
Rendered pages/_form.html.erb (3.7ms)

我该怎么做?目前该模型不保存。那么,具体来说,模型和控制器应该是什么样子的呢?

注意:我正在 Pages 控制器内创建一个 signup 对象(想想:新闻通讯)。

控制器

class PagesController < ApplicationController
 def index
  @signup = Signup.new
 end

def create
 @signup = Signup.new(params[:signup])
 respond_to do |format| 
  if @signup.save
    format.html
    #format.js
  else
    format.html {render action: :index}
   end
  end
 end
end

模型

class Signup < ActiveRecord::Base
  attr_accessible :email_address
  # email_regex = come up with something
  validates :email_address, presence: true,
                        #format: {with: email_regex}, uniqueness: {message: 'there can only be one you.'}                                    
end

_form.html.erb

<%= form_for(@signup, as: :post, url: pages_path) do |f| %>
  <% if @signup.errors.any? %>
    <div id="error_explanation">
    <p><%= pluralize(@signup.errors.count, "error") %> prohibited this post from being saved:</p>
   <ul>
    <% @signup.errors.full_messages.each do |user| %>
    <li><%= user %></li>
    <% end %>
   </ul>
  </div>
 <% end %>

 <div class="field">
   <%= f.label :email_address %><br />
   <%= f.email_field :email_address %>
   <%= f.label :send_once %><br />
   <%= f.check_box :send_once %>
   <%= f.label :send_any_time %><br />
   <%= f.check_box :send_any_time %>

  </div>

  <div class="actions">
   <%= f.submit %>
  </div>
<% end %>

【问题讨论】:

    标签: ruby-on-rails checkbox


    【解决方案1】:

    您的参数以 :post 的形式传入,而您的 create 语句正在寻找参数 [:signup]。您要么需要更改控制器以查找 params[:post],要么更改表单以提交给 params[:signup]。

    <%= form_for(@signup, as: :signup, url: pages_path) do |f| %>
    

    您还需要检查复选框是否被选中。
    假设您的参数是:

    "signup"=>{"email_address"=>"email@examp.le", "send_once"=>"0", "send_any_time"=>"1"}
    

    你会想要做的:

    class PagesController < ApplicationController
      def index
       @signup = Signup.new
      end
    
      def create
        @signup = Signup.new(params[:signup])
        if @signup.send_once == "1" or @signup.send_any_time == "1" then
          respond_to do |format| 
            if @signup.save
              format.html
            else
              format.html {render action: :index}
            end
          end
        else
          # what do you want to do if they didn't sign up?  redirect somewhere?
        end
      end
    end
    

    【讨论】:

    • 感谢这很容易理解。我对as 选项和method 选项感到困惑。
    • 事实证明,将 if 语句设置为字符串“1”而不是 true,它们是布尔类型,阻止了记录的保存。尽管如此,@denise-mauldin 还是很有帮助的!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-14
    • 2023-04-02
    • 2016-09-15
    • 2014-10-14
    • 2012-06-29
    • 1970-01-01
    相关资源
    最近更新 更多