Rails redirect_to не работает? - PullRequest
       0

Rails redirect_to не работает?

1 голос
/ 13 января 2012

Я пытался найти другие ответы для этого, но я не могу понять, почему мой редирект не работает.

Итак, я использую Devise с Rails 3.1 и создаю сайт для покупок. Посетителям не разрешается добавлять вещи в свою корзину, если они не вошли в систему. У меня проблемы с этим: если они не вошли в систему, я хочу перенаправить их на страницу индекса товаров. Вот что у меня есть:

class ItemsController < ApplicationController
  def add_to_cart
    @item = Item.find(params[:id])
    if current_user
      @item.update_attributes(:cart_id => @current_cart.id)
      redirect_to :back
    else
      redirect_to categories_path, notice: 'You must sign in to add an item to your cart.'
    end
  end
.
.
.
end

На данный момент, когда я щелкаю ссылку, чтобы добавить в корзину, метод запускается (я вижу, как Rails загружает и определяет @item в журнале сервера), и он достигает оператора 'else', но не перенаправляет случается.

Я уже создал скаффолдинг для индекса, нового и т. Д. (Все действия RESTful). Кроме того, я уверен, что достигаю метода add_to_cart, потому что я пытался отладить некоторые операторы put. Что здесь происходит?

EDIT:

Кроме того, еще одна странная вещь, которая может быть полезна ... Сервер, кажется, пытается выполнить этот метод дважды и пытается "получить" категории дважды:

Started GET "/items/3/add_to_cart" for 127.0.0.1 at 2012-01-12 16:53:11 -0800 Processing by ItemsController#add_to_cart as JS Parameters: {"id"=>"3"} Category Load (0.3ms) SELECT "categories".* FROM "categories" Item Load (0.2ms) SELECT "items".* FROM "items" WHERE "items"."id" = $1 LIMIT 1 [["id", "3"]] Redirected to <a href="http://localhost:3000/categories" rel="nofollow">http://localhost:3000/categories</a> Completed 302 Found in 26ms

Started GET "/items/3/add_to_cart" for 127.0.0.1 at 2012-01-12 16:53:11 -0800 Processing by ItemsController#add_to_cart as JS Parameters: {"id"=>"3"} Category Load (0.2ms) SELECT "categories".* FROM "categories" Item Load (0.2ms) SELECT "items".* FROM "items" WHERE "items"."id" = $1 LIMIT 1 [["id", "3"]] Redirected to <a href="http://localhost:3000/categories" rel="nofollow">http://localhost:3000/categories</a> Completed 302 Found in 25ms

Started GET "/categories" for 127.0.0.1 at 2012-01-12 16:53:12 -0800 Processing by CategoriesController#index as JS Category Load (0.2ms) SELECT "categories".* FROM "categories" CACHE (0.0ms) SELECT "categories".* FROM "categories" Rendered categories/index.html.erb within layouts/application (0.0ms) Completed 200 OK in 35ms (Views: 28.5ms | ActiveRecord: 4.2ms)

Started GET "/categories" for 127.0.0.1 at 2012-01-12 16:53:12 -0800 Processing by CategoriesController#index as JS Category Load (0.2ms) SELECT "categories".* FROM "categories" CACHE (0.0ms) SELECT "categories".* FROM "categories" Rendered categories/index.html.erb within layouts/application (0.0ms) Completed 200 OK in 37ms (Views: 30.6ms | ActiveRecord: 4.2ms)

РЕДАКТИРОВАТЬ 2 (по запросу Delba)

resources :items do
  member do
    get 'add_to_cart'
  end
end

РЕДАКТИРОВАТЬ 3: изменение оператора else для ответа на JavaScript

  respond_to do |format|
    format.js { redirect_to items_path, notice: 'You must sign in to add an item to your cart.' }
  end

1 Ответ

3 голосов
/ 13 января 2012

Для тех, кому могут понадобиться ответы на этот вопрос, просто замените операторы redirect_to следующим:

  respond_to do |format|
    format.js
  end

Затем в ваших представлениях по элементам создайте страницу add_to_cart.js.erb, состоящую из javascript, чтобы делать уведомления, или делайте что угодно. Вот что я положил в свой:

alert("Need to be signed in")

РЕДАКТИРОВАТЬ: Кроме того, для части, где он выполняется дважды: это несколько не связано, но по какой-то причине по умолчанию Rails включает в себя дубликаты Javascripts. В частности, посмотрите на application.js: он говорит, что требует jquery и требует jquery_ujs. Отключите один из них, и вы свободны дома.

Чтобы отключить один из этих javascripts:

Перейти к assets / application.js

Удалите комментарии (//), прежде чем требовать jquery, требуется дерево.

Таким образом, Rails не принимает значение по умолчанию и вместо этого включает в себя только jquery и любые другие javascripts, которые вы имеете в assets / javascripts

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...