2013-07-28 3 views
1

Я учусь, когда строил свой воображаемый сайт электронной коммерции. Я заметил, что нет способа повторно заказать продукцию. Поэтому я добавил поле в базу данных и расширил модель. Все хорошо работает в IRB/Pry.Spree - Admin - Пользовательский контроллер - Форма сообщения - Переадресация на логин

Теперь я собираюсь добавить его как функцию в конец Шпрее. Я добавил подменю на вкладку продукта и новый контроллер для выполнения задачи. Идея состоит в том, чтобы показать список текстовых полей и выбрать и при отображении упорядочить по полю. Звучит просто.

Но когда я отправляю форму, это заставляет меня выйти из раздела администратора и перенаправлять меня на страницу входа. Я попытался с PostMan (chrome) сделать пустой HTTP-пост и получил тот же результат

Это мой контент.

Контроллер/Шпрее/администратор/product_order_controller.rb

class Spree::Admin::ProductOrderController < Spree::Admin::BaseController 
    def index 
    @products = Spree::Product.order('placement_order ASC') 
    end 

    def update 
    end 
end 

просмотров/Шпрее/администратор/product_order/index.html.slim

= render :partial => 'spree/admin/shared/product_sub_menu' 
h1 Product Order 

form method="post" action="/admin/product_order/update" 
    h3 Select the order of products :- 
    table 
    tr 
     td Image 
     td Name 
     td Order 

    - @products.each do | product | 
     = render :partial => 'spree/admin/product_order/product_order', :locals => { :product => product } 
    input type="submit" name="submit" value="Submit" 

routes.rb

match '/admin/product_order'   => 'spree/admin/product_order#index' 
    match '/admin/product_order/index' => 'spree/admin/product_order#index' 
    match '/admin/product_order/update' => 'spree/admin/product_order#update' 

на пост: он перенаправляет на http://localhost:3000/login

Я делаю что-то неправильно, или я делаю это по-другому?

Заранее спасибо.

Имейте большой понедельник, я знаю ... его будет ужасна для большинства из нас :)

+0

Вы должны полагаться на помощника form_tag, чтобы вручную не писать форму и маршруты, если это возможно. Следуйте за советом по рельсам, сделайте вашу жизнь проще. –

+0

Вам нужно выяснить, что заставляет вашу страницу перенаправляться на страницу входа. Я предполагаю, что проверка доступа не работает.Вы должны увидеть, если вы получаете исключение CanCan :: AccessDenied, которое где-то спасается, которое перенаправляет вас на страницу входа. Похоже, что ваше действие обновления не выполняется, а это значит, что что-то происходит до того, как оно когда-либо попадет в ваш класс. – gmacdougall

ответ

0

Я играл вокруг него в течение некоторого времени. Сначала я думал, что токен CSRF отсутствует. Но тогда это было в заголовке страницы.

Тогда были формы. Глядя на формы, им не хватало нескольких скрытых полей, которые звучали как безопасность. Они были похожи на

<input name="utf8" type="hidden" value="&#x2713;" /> 
<input name="_method" type="hidden" value="put" /> 
<input name="authenticity_token" type="hidden" value="[long code]" /> 

Понимание я пропускаю некоторые вещи и те вещи, как правило, мы не ставим вручную ...

я использовал метод формы помощника.

= render :partial => 'spree/admin/shared/product_sub_menu' 
h1 Product Order 

= form_tag("/admin/product_order/update", method: "post") do 
    h3 Select the order of products :- 
    table 
    tr 
     td Image 
     td Name 
     td Order 

    - @products.each do | product | 
     = render :partial => 'spree/admin/product_order/product_order', :locals => { :product => product } 
    = submit_tag("Save") 

Использование form_tag устраняет проблему.

В различных базовых приложениях hello world с использованием голой формы работало. Но я думаю, что новые ограничения исходят от Spree или другой библиотеки, которую я выбрал.

Спасибо за советы.

Смежные вопросы