Redmine插件视图挂钩:问题更改时刷新

6
我编写了一个插件,可以获取最新问题并在主页上显示它们。看起来一切都运作得很好,但只有在我第一次重新启动服务器运行它时才有效 - 之后它会从那个时间开始“缓存”问题,并且不会获取新的问题。
我已经阅读了一些相关信息,似乎我应该为问题编写一个补丁来在我的插件中添加额外功能。是这样吗?如果是这样,我应该在 after_save 动作中添加什么?对于 LatestPostsSetup 模型也是如此 - 如果我更改了最大计数和应该显示在哪一侧的值,则主页不会反映出来,直到我重新启动服务器。
如果我提出的问题看起来相当微不足道,请不要介意,我是 Ruby 的新手。请查看下面的视图帮助器代码:
module LatestPosts
    class ViewHookListener < Redmine::Hook::ViewListener

        require  'plugins/latest_posts/app/models/latest_posts_setup.rb'
        setup = LatestPostsSetup.find_by_id(1)

        if setup == nil
          count = LatestPostsSetup::DEFAULT_COUNT
          side  = LatestPostsSetup::DEFAULT_SIDE
        else
          count = setup.max_count
          side  = setup.side
        end

        issues  = Issue.find(:all, :limit => count, :order => "created_on DESC")

        if side == 'left'
           render_side = :view_welcome_index_left
        else
           render_side = :view_welcome_index_right
        end
        render_on render_side, :locals => {:issues => issues}, :partial => "latest_issues/issues"
    end end

编辑

我现在已经修改了视图助手,让它能够即时渲染HTML,这样我就不需要重新启动Apache才能看到新的问题。但我不明白,为什么这种方法比使用HTML模板更有效呢?请看下面的代码:

# lib/latest_posts_hook_listener.rb
module LatestPosts
    class ViewHookListener < Redmine::Hook::ViewListener

        def view_welcome_index_left(context={})
            setup = load_setup()
            if setup[:side] == "left"
                load_issues(setup[:count])
            end
        end

        def view_welcome_index_right(context={})
            setup = load_setup()
            if setup[:side] == "right"
                load_issues(setup[:count])
            end
        end

        def load_setup()
            require  'plugins/latest_posts/app/models/latest_posts_setup.rb'
            setup = LatestPostsSetup.find_by_id(1)

            if setup == nil
                count = LatestPostsSetup::DEFAULT_COUNT
                side  = LatestPostsSetup::DEFAULT_SIDE
            else
                count = setup.max_count
                side  = setup.side
            end

            {:count => count, :side => side}
        end

        def load_issues(count)
            html = '<div class="box" id="statuses">'
            html += '<h3 class="icon22 icon22-users">Latest Issues</h3><ul>'
            issues  = Issue.find(:all, :limit => count, :order => "created_on DESC")
            issues.each do |issue|
                html += <<EOHTML
                  <li>
                      #{link_to h(truncate(issue.subject, :length => 60)), :controller => 'issues', :action => 'show', :id => issue } (#{ format_date(issue.created_on) })
                   </li>
EOHTML
            end
            html += '</ul></div>'
            return html
        end
    end
end
1个回答

1

让我们看看这是否能帮到您。我正在阅读本教程,在使用Hooks部分中有这段话:

要在视图中使用一个或多个hooks,您需要创建一个继承自Redmine::Hook::ViewListener的类,并实现命名为所需hook的方法。

在您的代码中,我看到您已经创建了该类,但是我没有看到您实现了要使用的hooks的方法。

就像在该部分给出的示例中一样,我去查看了这个视图http://www.redmine.org/projects/redmine/repository/entry/tags/2.0.0/app/views/issues/show.html.erb(不确定这是否是您需要的视图),它显示有两个可用的钩子:一个名为:view_issues_show_details_bottom,另一个名为:view_issues_show_description_bottom,我期望您会在您的代码中实现与钩子名称匹配的方法。这个视图中的这些钩子是否能够展示您想要的内容?如果不能,您可能需要使用不同的视图。

为了参考,我查看了Redmine视图列表,链接在此处:http://www.redmine.org/projects/redmine/repository/show/tags/2.0.0/app/views


谢谢您的回复,但这似乎不是我想要的。我已经更改了render_on:view_welcome_index_right,:locals => {:issues => issues},:partial =>“latest_issues / issues”,结果是相同的。我想要显示的问题数没有受到数据库更改的影响。 - Kasia Gogolek

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接