3

我想在 Redmine 的“添加新闻”页面中添加一个自定义过滤器字段,这样当我添加新新闻时,我可以选择应该发送电子邮件的用户组。

该字段本身是 Redmine 用户组的列表,每个用户至少分配给其中 1 个。

有人做过吗?任何建议,将不胜感激

我找到了与该问题相关的 3 个文件:

  • /app/controller/news_controller.rb
  • /app/models/news.rb
  • /app/views/news/_form.html.erb
环境:
  Redmine 版本 2.2.1.stable.11156
  Ruby 版本 1.8.7 (x86_64-linux)
  Rails 版本 3.2.11
  环境制作
  数据库适配器 MySQL
Redmine插件:
  没有安装插件

到目前为止,我在 Redmine 中只进行了 1 次修改,它将添加的消息发送给所有注册用户。文件:/app/modelsmailer.rb

概述:

http://www.lwks.com/images/custom/redmine_question.png

编辑:按照您的建议,我将邮件功能移至控制器:

  def create
    @news = News.new(:project => @project, :author => User.current)
    @news.safe_attributes = params[:news]
    @news.save_attachments(params[:attachments])

    if @news.save
      #news_added(@news)
      if params[:group]
        mail :to => GroupsUser.find(params[:group][:ids]).joins(:users).select("users.mail").compact,
            :subject => "[#{@news.project.name}] #{l(:label_news)}: #{@news.title}"
      else
        render :new
      end
    end
  end

但我收到错误:NameError (uninitialized constant NewsController::GroupsUser): pointing to line

mail :to => GroupsUser.find
4

1 回答 1

3

news_controller.rb:

def new
  @news = News.new
  @groups = GroupsUser.all
end

新闻/_form.html.erb:

<%= label_tag :group_ids "Groups"
<%= collection_select :group, :ids, @groups, :id, :name, {}, multiple: true %>

编辑:

我将不得不对你的控制器的外观进行一些猜测,但我会给你一些接近的东西。根据您提供的邮件功能,我假设在保存create后从控制器中调用它。News之后我会调用邮件功能。像这样的东西:

def create
  news = News.new(params[:news]
  if news.save
    news_added(news)
    send_mail_to_groups(params[:group][:ids]) if params[:group]
    redirect_to ...
  else
    render :new
  end
end

邮寄部分应从news_added

def news_added(news)
  redmine_headers 'Project' => news.project.identifier
  @author = news.author
  message_id news
  @news = news
  @news_url = url_for(:controller => 'news', :action => 'show', :id => news)
end

支持自己的新程序:

send_mail_to_users_by_group_ids(group_ids)
    # Woo: Sent to all users, despite their email settings
    mail :to => GroupsUser.find(group_ids).joins(:users).select("users.mail").compact,
      :subject => "[#{@news.project.name}] #{l(:label_news)}: #{@news.title}"
end

您可能希望添加一个where仅包含活动用户的子句。

我认为这是对的。我正在做这件事,所以那里可能有一两个错字或错误。希望它为您指明正确的方向。

于 2013-01-21T22:50:32.893 回答