【问题标题】:How to update a model record? [Rails 4]如何更新模型记录? [导轨 4]
【发布时间】:2014-06-13 14:34:03
【问题描述】:

我需要在我的 Rails 应用程序中更新我的Pack 模型,但是每次我提交表单时,都没有任何反应。代码如下:

packs_controller.rb

  def edit
    @pack = Pack.find(params[:id])
  end

  def update
    @pack = Pack.find(params[:id])
    if @pack.update_attributes(pack_params)
      flash[:success] = "Update successful!"
      redirect_to '/packs'
    else
      render 'edit'
    end
  end

  private

    def pack_params
      params.require(:pack).permit(:amount)
    end

_edit_packs.html.haml

= form_for(@pack) do |f|
    .form-group
        = f.label :amount
        = f.text_field :amount, :autofocus => true, class: 'form-control'
    = f.submit 'Submit', :class => 'button right'

有什么想法吗?

编辑

这是按下提交时的日志:

Started PATCH "/packs/11" for 127.0.0.1 at 2014-06-13 19:27:12 +0200
Started PATCH "/packs/11" for 127.0.0.1 at 2014-06-13 19:27:12 +0200
Processing by PacksController#update as HTML
Processing by PacksController#update as HTML
  Parameters: {"utf8"=>"✓", "authenticity_token"=>"oa20eUeZPxbV+mX0mQyDyFibwWCnOlrtP/9uoKq2HU0=", "pack"=>{"amount"=>"1"}, "commit"=>"Submit", "id"=>"11"}
  Parameters: {"utf8"=>"✓", "authenticity_token"=>"oa20eUeZPxbV+mX0mQyDyFibwWCnOlrtP/9uoKq2HU0=", "pack"=>{"amount"=>"1"}, "commit"=>"Submit", "id"=>"11"}
  Pack Load (0.1ms)  SELECT  "packs".* FROM "packs"  WHERE "packs"."id" = ?  ORDER BY created_on DESC LIMIT 1  [["id", 11]]
  Pack Load (0.1ms)  SELECT  "packs".* FROM "packs"  WHERE "packs"."id" = ?  ORDER BY created_on DESC LIMIT 1  [["id", 11]]
   (0.1ms)  begin transaction
   (0.1ms)  begin transaction
  Pack Exists (0.1ms)  SELECT  1 AS one FROM "packs"  WHERE ("packs"."created_on" = '2014-06-13' AND "packs"."id" != 11) LIMIT 1
  Pack Exists (0.1ms)  SELECT  1 AS one FROM "packs"  WHERE ("packs"."created_on" = '2014-06-13' AND "packs"."id" != 11) LIMIT 1
   (0.0ms)  rollback transaction
   (0.0ms)  rollback transaction
  Rendered packs/_edit_packs.html.haml (1.8ms)
  Rendered packs/_edit_packs.html.haml (1.8ms)
  Rendered packs/edit.html.haml within layouts/application (2.5ms)
  Rendered packs/edit.html.haml within layouts/application (2.5ms)
  User Load (0.2ms)  SELECT  "users".* FROM "users"  WHERE "users"."id" = 3  ORDER BY "users"."id" ASC LIMIT 1
  User Load (0.2ms)  SELECT  "users".* FROM "users"  WHERE "users"."id" = 3  ORDER BY "users"."id" ASC LIMIT 1
  Rendered layouts/_navigation_links.html.erb (1.2ms)
  Rendered layouts/_navigation_links.html.erb (1.2ms)
  Rendered layouts/_navigation.html.haml (1.9ms)
  Rendered layouts/_navigation.html.haml (1.9ms)
  Rendered layouts/_messages.html.haml (0.1ms)
  Rendered layouts/_messages.html.haml (0.1ms)
Completed 200 OK in 28ms (Views: 22.0ms | ActiveRecord: 0.6ms)
Completed 200 OK in 28ms (Views: 22.0ms | ActiveRecord: 0.6ms)

编辑 2

在查看了一些 cmets 并考虑了问题之后,我对 :created_on 字段的唯一性验证似乎存在问题,该字段存储了创建记录的日期。

编辑 3

确认::created_on 是问题的根源!我有一个强制执行:created_on 唯一性的验证。当我删除它时,表格就起作用了。这是我的模型:

pack.rb

class Pack < ActiveRecord::Base
    belongs_to :user

    default_scope -> { order('created_on DESC') }
    scope :today, -> { where(:created_at => (Time.now.beginning_of_day..Time.now)) }
    scope :week, -> { where(:created_at => (Time.now.beginning_of_week..Time.now))}
    scope :month, -> { where(:created_at => (Time.now.beginning_of_month..Time.now))}
    scope :year, -> { where(:created_at => (Time.now.beginning_of_year..Time.now))}

    validates :user_id, presence: true
    validates :created_on, uniqueness: true
    validates :amount, presence: true, length: { maximum: 1 }
end

关于如何解决这个问题的任何建议?我应该开始一个新问题吗?

【问题讨论】:

  • but every time I submit the form, nothing happens. 确实发生了一些事情。正在显示什么页面?
  • submitting the form 时发布您的log information 会很有帮助。
  • 您是否对Pack 模型中的amount 字段进行了验证?
  • 或任何其他验证,如果一个包的数量超过一个数量
  • 我认为它与 .form-group 以及您使用 haml 的事实有关,查看生成的 html 提交按钮不会在表单中或删除 .form-group (我无法确认我使用的是移动设备)

标签: ruby-on-rails ruby forms view controller


【解决方案1】:

根据您的日志,您的数据库中似乎有多个包,created_on 等于 '2014-06-13',这将导致 created_on 唯一性验证失败。

在 Rails 控制台中检查:

Pack.where(created_on: '2014-06-13')

如果有多个,删除额外的,它应该可以工作。

【讨论】:

    【解决方案2】:

    如果您尝试将一个包限制为每个用户每天一个,您需要为验证时创建的添加一个范围选项:

    validates :created_on, uniqueness: true, scope: user
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多