【问题标题】:Ruby on Rails, Form data not adding to the database via sqlRuby on Rails,表单数据未通过 sql 添加到数据库
【发布时间】:2017-04-18 13:01:12
【问题描述】:

在我的 ruby​​ 网站上下订单时,只有一半的信息会添加到数据库中。 当我提交表单时,服务器返回以下内容:

Processing by OrdersController#create as HTML
  Parameters: {"utf8"=>"✓", "authenticity_token"=>"bKcYiOq93T301ty4av2yyAqr4kKY11nn8I7qP7SWKmVgs/qgRmGcf82m5nAdnP1QqlvRFX8vjiSXa7dD4temwg==", "order"=>{"name"=>"Bruce Clay", "email"=>"bruce@dia.com", "address"=>"12", "city"=>"chippenham", "postcode"=>"kt12 3pw"}, "DeliveryDates.DeliveryConfirm"=>"false", "DeliveryDates.DeliveryDisagree"=>"True", "DeliveryDates.DeliveryDisagreeMessage"=>"", "ddate1"=>"20/04/2017", "ddate2"=>"25/04/2017", "ddate3"=>"23/04/2017", "card-identifier"=>"7FA7C55A-D3B3-45AC-AA82-D8850CD1E715"}

除了 ddates 选项之外,还会插入信息。

SQL (9.9ms)  INSERT INTO `orders` (`name`, `email`, `address`, `city`, `postcode`, `buyer_id`, `latitude`, `longitude`, `created_at`, `updated_at`) VALUES ('Bruce Claypot', 'bruce@dia.com', '12', 'chippenham', 'kt12 3pw', 1, 51.3862775, -0.3865515, '2017-04-18 12:50:21', '2017-04-18 12:50:21')

订单控制器具有以下参数:

def order_params
  params.require(:order).permit(:name, :email, :address, :city, :county, :postcode, :ddate1, :ddate2, :ddate3)
end

并在 def 创建:

@order = Order.new(order_params)

当我尝试更改参数选项时,我真的不知道是什么导致了这个问题,但没有任何效果。

感谢您的帮助。

添加订单模型。

class Order < ActiveRecord::Base
    belongs_to :user

    has_many :product_items, dependent: :destroy 
     has_many :statuses

    validates :name, :email, :address, :city, :postcode, presence: true


    geocoded_by :postcode

# def address
#   [address, postcode].compact.join(', ')
# end# can also be an IP address
after_validation :geocode# auto-fetch coordinates

    def add_product_items_from_basket(basket)
        basket.product_items.each do |item|
            item.basket_id = nil
            product_items << item
        end
    end

    def total_price
        product_items.map(&:total_price).sum
    end

STATUSES = ['pending', 'offered', 'accepted', 'declined', 'returned', 'completed', 'canceled', 'refunded']
validates_inclusion_of :status, :in => STATUSES,
          :message => "{{value}} must be in #{STATUSES.join ','}"

end

正在使用订单表单脚本。

 <input class="text"  id="ddate1" name="ddate1" type="text" value=""><img class="ui-datepicker-trigger" src="../assets/calendar.png" alt="Select date" title="Select date">
                    </div>
                    <span class="field-validation-valid" data-valmsg-for="DeliveryDates.DeliveryDateFirst" data-valmsg-replace="true"></span>
                </th>
                <script>
    $('#order_ddate1').ready(function(){
           var date_input=$('input[name="ddate1"]'); //our date input has the name "date"
      var container=$('.bootstrap-iso form').length>0 ? $('.bootstrap-iso form').parent() : "body";
      var options={
        format: 'dd/mm/yyyy',
        startDate: "+2d",
        container: container,
        todayHighlight: true,
        autoclose: true,
      };
      date_input.datepicker(options);
    })
</script>

【问题讨论】:

  • 你应该将你的order_params函数体修复为params.require(:order).permit(:name, :email, :address, :city, :postcode, :buyer_id, :latitude, :longitude)或类似的东西。
  • order_params 操作下buyer_idlatitudelongitude 属性缺失,请尝试添加这些
  • @SanjuBMyh 我已经添加了这些额外内容并且它们处理正确,但是仍然缺少 ddate 。

标签: mysql sql ruby-on-rails ruby


【解决方案1】:

您已将强参数设置为:

def order_params
  params.require(:order).permit(:name, :email, :address, :city, :county, :postcode, :ddate1, :ddate2, :ddate3)
end

这表示您允许来自订单对象内部的ddate1, ddate2 and ddate3,即它们应该在订单哈希内,而 您的参数显示它们在要求对象之外order

Parameters: {"utf8"=>"✓", "authenticity_token"=>"bKcYiOq93T301ty4av2yyAqr4kKY11nn8I7qP7SWKmVgs/qgRmGcf82m5nAdnP1QqlvRFX8vjiSXa7dD4temwg==", "order"=>{"name"=>"Bruce Clay", "email"=>"bruce@dia.com", "address"=>"12", "city"=>"chippenham", "postcode"=>"kt12 3pw"}, "DeliveryDates.DeliveryConfirm"=>"false", "DeliveryDates.DeliveryDisagree"=>"True", "DeliveryDates.DeliveryDisagreeMessage"=>"", "ddate1"=>"20/04/2017", "ddate2"=>"25/04/2017", "ddate3"=>"23/04/2017", "card-identifier"=>"7FA7C55A-D3B3-45AC-AA82-D8850CD1E715"}

您需要像使用其他属性 name, email etc 一样将它们放在视图中 最好将它们用作:

<%= f.text_field :ddate1, class="your_class" %>

其中 f 是您的表单对象迭代器。

我的猜测是您正在使用 html 语法为ddate1, ddate2, ddate3 生成表单元素。请更改它们

希望对你有帮助

【讨论】:

  • 感谢您的回答。在表格中,我一直在使用从我试图重新创建的网站的 Asp.net 版本中获取的脚本。感谢您的帮助,我会尝试更改它。
  • 将此添加到表单 name="order[ddate1]" 而不是 name="ddate1" 解决了问题。
猜你喜欢
  • 2021-10-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-22
  • 1970-01-01
  • 2017-08-24
相关资源
最近更新 更多