Как обновить запись модели? [Rails 4]

#ruby-on-rails #ruby #forms #view #controller

#ruby-on-rails #ruby #формы #Вид #контроллер

Вопрос:

Мне нужно обновить мою Pack модель в моем приложении Rails, но каждый раз, когда я отправляю форму, ничего не происходит. Вот код:

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

После просмотра некоторых комментариев и размышлений о проблеме, похоже, возникла проблема с моей проверкой уникальности в поле: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
  

Любые предложения о том, как обойти это? Должен ли я начать новый вопрос?

Комментарии:

1. but every time I submit the form, nothing happens. что-то происходит. Какая страница отображается?

2. Публикация вашего log information when submitting the form была бы очень полезна.

3. Есть ли у вас какая-либо проверка amount поля в Pack модели?

4. Или любая другая проверка, если пакет содержит больше, чем просто количество

5. Я думаю, что это связано с .form-group и тем фактом, что вы используете haml, посмотрите на сгенерированный html, кнопки отправки не будет в форме или удалите .form-group (я не могу подтвердить, что я на мобильном телефоне)

Ответ №1:

Судя по вашим журналам, похоже, что в вашей базе данных есть несколько пакетов created_on '2014-06-13' , значение которых равно, что приведет к сбою проверки уникальности created_on.

Проверьте это в консоли rails:

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

Если их несколько, удалите дополнения, и это должно сработать.

Ответ №2:

Если вы пытаетесь ограничить пакет одним на пользователя в день, вам необходимо добавить параметр области видимости в созданный при проверке:

 validates :created_on, uniqueness: true, scope: user