Ruby on Rails 3: 1x Циркулярный метод, возвращающий уровень стека слишком глубоко

Для резюме у меня есть blog_posts контроллер. blog_posts Контроллер функционирует в основном как обычный CRUD. Однако в модели я записываю state из blog_posts, Таким образом, пользователь может опубликовать запись, но она не будет в активном состоянии, что означает, что никто не сможет ее просмотреть. Как только они меняют состояние на Активное, его можно просмотреть, и поэтому предлагается, чтобы blog_post быть оставленным статичным и чтобы пользователь не обновлял его, НО, мы все еще разрешаем обновление с предупреждениями.

Итак, моя задача - создать warning страница брандмауэра. Когда пользователь нажимает edit для активного blog_post, страница предупреждения должна появиться, затем они должны нажать продолжить или назад.

Мой код выглядит так:

def edit
  @blog = Blog.find(params[:blog_id])
  @blog_post = @blog.blog_posts.find(params[:id])
  if @blog_post.state == "Active" && @blog_post.editing_after_active.nil?
    redirect_to warning_path(@blog, @blog_post)
  end
end

def warning
  @blog = Blog.find(params[:blog_id])
  @blog_post = @blog.blog_posts.find(params[:id])
  if params[:no]
    @blog_post.update_attributes(editing_after_active: nil)
    redirect_to blog_blog_posts_path(@blog)
  elsif params[:yes]
    @blog_post.update_attributes(editing_after_active: "yes")
    redirect_to edit_blog_blog_post_path(@blog, @blog_post)
  end
end

Вот как я считаю, что это работает.

  1. Пользователь переходит на страницу редактирования blog_post для активной записи.
  2. Контроллер редактирования видит, что сообщение активно, и что пользователь не принял предупреждение, и перенаправляет на страницу предупреждения. (Is Active и edit_after_active оба имеют значение true)
  3. На странице предупреждения есть два варианта (да / нет).
  4. Пользователь нажимает да для продолжения. Атрибут edit_after_active должен быть установлен в "да", что означает, что они приняли предупреждение.
  5. Они перенаправлены для редактирования.
  6. Критерий оценивается снова, но на этот раз он оценивается как ложный.
  7. Страница редактирования отображается.

Что мне здесь не хватает? Предполагается, что уровень стека слишком глубокий для бесконечных циклов. Является ли этот цикл бесконечным?

ОБНОВИТЬ:

class BlogPost < ActiveRecord::Base
  include BlogModule
  belongs_to :blog
  has_one :visit, :as => :visitable

  has_many :assets, :as => :assetable, :dependent => :destroy

  has_many :bookmarks, :dependent => :destroy
  has_many :bookmark_users, :through => :bookmarks, :dependent => :destroy

  has_many :taggings, :as => :taggable, :dependent => :destroy
  has_many :tags, :through => :taggings

  # more has_many


  attr_accessible :tag_ids, :asset_ids # more attr_accessible
  attr_accessor :editing_after_active


  def editing_after_active
    editing_after_active
  end

end

ОБНОВИТЬ:

Connecting to database specified by database.yml


Started POST "/blogs/resort-casino-chicago/blog_posts/39/warning" for 127.0.0.1 at 2014-02-27 14:41:57 -0500
Processing by blogpostsController#warning as HTML
Parameters: {"utf8"=>"✓", "authenticity_token"=>"6UaDU1Sn3yiKlGl6OJCUapmU4KCSilLL8Lgo+jsyJdI=", "yes"=>"Yes, I am authorized to continue.", "blog_id"=>"resort-casino-chicago", "blog_post_id"=>"39"}
 [1m [36mblog Load (0.8ms) [0m   [1mSELECT `blogs`.* FROM `blogs` WHERE `blogs`.`slug` = 'resort-casino-chicago' LIMIT 1 [0m
 [1m [35mblogpost Load (0.2ms) [0m  SELECT `blog_posts`.* FROM `blog_posts` WHERE `blog_posts`.`blog_id` = 1680 AND `blog_posts`.`id` = 39 LIMIT 1
 [1m [36m (0.2ms) [0m   [1mBEGIN [0m
 [1m [35m (0.1ms) [0m  COMMIT
Redirected to http://localhost:3000/blogs/resort-casino-chicago/blog_posts/39/edit
Completed 302 Found in 647ms (ActiveRecord: 8.4ms)


Started GET "/blogs/resort-casino-chicago/blog_posts/39/edit" for 127.0.0.1 at 2014-02-27 14:41:58 -0500
Processing by blogpostsController#edit as HTML
 Parameters: {"has_many"=>:posts, "blog_id"=>"resort-casino-chicago", "id"=>"39"}
 [1m [36mblog Load (0.9ms) [0m   [1mSELECT `blogs`.* FROM `blogs` WHERE `blogs`.`slug` = 'resort-casino-chicago' LIMIT 1 [0m
 [1m [35mblogpost Load (0.3ms) [0m  SELECT `blog_posts`.* FROM `blog_posts` WHERE `blog_posts`.`blog_id` = 1680 AND `blog_posts`.`id` = 39 LIMIT 1
Completed 500 Internal Server Error in 5ms

SystemStackError - stack level too deep:
  actionpack (3.2.11) lib/action_diblogtch/middleware/reloader.rb:70:in `'



Started POST "/__better_errors/70165434709380/variables" for 127.0.0.1 at 2014-02-27 14:41:58 -0500

ОБНОВИТЬ:

Хорошо, на странице с предупреждением я попытался отобразить текущее значение <% = @ blog_post.editing_after_active%>, и уровень стека оказался слишком глубоким только из-за попытки отобразить значение. Итак, ошибка скорее всего связана с установкой виртуального атрибута.

Я вручную установил значение edit_after_active следующим образом: def edit_after_active "yes" end

При этом форма предупреждения подается просто отлично. Итак, нужно выяснить, почему исходная настройка является рекурсивной.

0 ответов

Другие вопросы по тегам