南極の図書館

ペンギンが寝ていた…。

Redmineプラグインチュートリアルについて

Redmineのプラグインを作ろうと思い、redmine.jpを調べてみた。
探してみると「その他の文書」に「プラグインの開発」の項目がある。
プラグインの開発 | Redmine.JP
そこからredmine.orgのチュートリアルの日本語訳を見つけたのでやってみた。
プラグイン チュートリアル - r-labs

チュートリアルの実施

結論から言うと、プラグインを:project_menuにする箇所でエラーとなってしまった。
「メニューを拡張する。」の「プロジェクトメニューを拡張する。」にあるこのコード。

def index
  @project = Project.find(params[:project_id])
  @polls = Poll.find(:all) # @project.polls
end

controllerでvoteを呼んだときにparams[:project_id]に何も入っていないので、エラーとなる。

  @project = Project.find(params[:project_id])
  rescue ActiveRecord::RecordNotFound
    render_404
  end

ちなみに、こうするとちゃんと404が出る。(Redmine本体のコードがこうだった。)
チュートリアルで見落としたところは無いようだったので、自分で書いてみた。
毎回パラメータで渡すのは嫌な感じもあるけど、どうなんだろう。
もっと本家のコードを見て書き方を覚えていかないと。

差分

チュートリアルに記載されているコードとの差分を置いておきます。
vendor/plugins/redmine_polls/app/controllers/polls_controller.rb

class PollsController < ApplicationController
……
  def vote
    poll = Poll.find(params[:id])
    poll.vote(params[:answer])
    if poll.save
      flash[:notice] = 'Vote saved.'
-     redirect_to :action => 'index'
+     redirect_to :action => 'index', :project_id => params[:project_id]
    end
  end
……
end

vendor/plugins/redmine_polls/app/views/polls/index.html.erb

<h2>Polls</h2>
 <% @polls.each do |poll| %>
  <p>
  <%= poll[:question] %>?
-  <%= link_to 'Yes', {:action => 'vote', :id => poll[:id], :answer => 'yes'}, :method => :post %> (<%= poll[:yes] %>) /
-  <%= link_to 'No', {:action => 'vote', :id => poll[:id], :answer => 'no'}, :method => :post %> (<%= poll[:no] %>)
+  <%= link_to 'Yes', {:action => 'vote', :id => poll[:id], :answer => 'yes', :project_id => params[:project_id]}, :method => :post %> (<%= poll[:yes] %>) /
+  <%= link_to 'No', {:action => 'vote', :id => poll[:id], :answer => 'no', :project_id => params[:project_id]}, :method => :post %> (<%= poll[:no] %>)
  </p>
<% end %>