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
Вот как я считаю, что это работает.
- Пользователь переходит на страницу редактирования blog_post для активной записи.
- Контроллер редактирования видит, что сообщение активно, и что пользователь не принял предупреждение, и перенаправляет на страницу предупреждения. (Is Active и edit_after_active оба имеют значение true)
- На странице предупреждения есть два варианта (да / нет).
- Пользователь нажимает да для продолжения. Атрибут edit_after_active должен быть установлен в "да", что означает, что они приняли предупреждение.
- Они перенаправлены для редактирования.
- Критерий оценивается снова, но на этот раз он оценивается как ложный.
- Страница редактирования отображается.
Что мне здесь не хватает? Предполагается, что уровень стека слишком глубокий для бесконечных циклов. Является ли этот цикл бесконечным?
ОБНОВИТЬ:
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
При этом форма предупреждения подается просто отлично. Итак, нужно выяснить, почему исходная настройка является рекурсивной.