#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
whensubmitting 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