Я хочу добавить, обновить и удалить событие в моем календаре Redmine (почти как в календаре Google). Я установил Redmine в стеке Bitnami. Но я не могу понять структуру кода, так как у меня нет надлежащей документации. Есть ли кто-нибудь, кто может мне в этом помочь. Приведенный ниже код - это мой контроллер календаря.
class CalendarsController < ApplicationController
menu_item :calendar
before_action :find_optional_project
rescue_from Query::StatementInvalid, :with => :query_statement_invalid
helper :issues
helper :projects
helper :queries
include QueriesHelper
def show
if params[:year] and params[:year].to_i > 1900
@year = params[:year].to_i
if params[:month] and params[:month].to_i > 0 and params[:month].to_i < 13
@month = params[:month].to_i
end
end
@year ||= User.current.today.year
@month ||= User.current.today.month
@calendar = Redmine::Helpers::Calendar.new(Date.civil(@year, @month, 1), current_language, :month)
retrieve_query
@query.group_by = nil
@query.sort_criteria = nil
if @query.valid?
events = []
events += @query.issues(:include => [:tracker, :assigned_to, :priority],
:conditions => ["((start_date BETWEEN ? AND ?) OR (due_date BETWEEN ? AND ?))", @calendar.startdt, @calendar.enddt, @calendar.startdt, @calendar.enddt]
)
events += @query.versions(:conditions => ["effective_date BETWEEN ? AND ?", @calendar.startdt, @calendar.enddt])
@calendar.events = events
end
render :action => 'show', :layout => false if request.xhr?
end
end
Ниже приведен файл calender_helper.rb.
module CalendarsHelper
def link_to_previous_month(year, month, options = {})
target_year, target_month = if month == 1
[year - 1, 12]
else
[year, month - 1]
end
name = if target_month == 12
"#{month_name(target_month)} #{target_year}"
else
"#{month_name(target_month)}"
end
# \xc2\xab(utf-8) = «
link_to_month(("\xc2\xab " + name), target_year, target_month, options)
end
def link_to_next_month(year, month, options = {})
target_year, target_month = if month == 12
[year + 1, 1]
else
[year, month + 1]
end
name = if target_month == 1
"#{month_name(target_month)} #{target_year}"
else
"#{month_name(target_month)}"
end
# \xc2\xbb(utf-8) = »
link_to_month((name + " \xc2\xbb"), target_year, target_month, options)
end
def link_to_month(link_name, year, month, options = {})
link_to(link_name, {:params => request.query_parameters.merge(:year => year, :month => month)}, options)
end
end
Ниже представлен вид show.html.erb.
<h2><%= @query.new_record? ? l(:label_calendar) : @query.name %></h2>
<%= form_tag({:controller => 'calendars', :action => 'show', :project_id => @project},
:method => :get, :id => 'query_form') do %>
<%= hidden_field_tag 'set_filter', '1' %>
<fieldset id = "filters" class = "collapsible <%= @query.new_record? ? "" : "collapsed" %>">
<legend onclick = "toggleFieldset(this);"><%= l(:label_filter_plural) %></legend>
<div style = "<%= @query.new_record? ? "" : "display: none;" %>">
<%= render :partial => 'queries/filters', :locals => {:query => @query} %>
</div>
</fieldset>
<p style = "float:right;">
<%= link_to_previous_month(@year, @month, :accesskey => accesskey(:previous)) %> | <%= link_to_next_month(@year, @month, :accesskey => accesskey(:next)) %>
</p>
<p class = "buttons">
<%= label_tag('month', l(:label_month)) %>
<%= select_month(@month, :prefix => "month", :discard_type => true) %>
<%= label_tag('year', l(:label_year)) %>
<%= select_year(@year, :prefix => "year", :discard_type => true) %>
<%= link_to_function l(:button_apply), '$("#query_form").submit()', :class => 'icon icon-checked' %>
<%= link_to l(:button_clear), { :project_id => @project, :set_filter => 1 }, :class => 'icon icon-reload' %>
</p>
<% end %>
<%= error_messages_for 'query' %>
<% if @query.valid? %>
<%= render :partial => 'common/calendar', :locals => {:calendar => @calendar} %>
<%= call_hook(:view_calendars_show_bottom, :year => @year, :month => @month, :project => @project, :query => @query) %>
<p class = "legend cal">
<span class = "starting"><%= l(:text_tip_issue_begin_day) %></span>
<span class = "ending"><%= l(:text_tip_issue_end_day) %></span>
<span class = "starting ending"><%= l(:text_tip_issue_begin_end_day) %></span>
</p>
<% end %>
<% content_for :sidebar do %>
<%= render :partial => 'issues/sidebar' %>
<% end %>
<% html_title(l(:label_calendar)) -%>
Это единственный код, связанный с календарем в routes.rb
get '/projects/:project_id/issues/calendar', :to => 'calendars#show', :as => 'project_calendar'
get '/issues/calendar', :to => 'calendars#show'

В этом контроллере у вас есть только действие show (HTTP GET). Если вам нужны update и delete, вы должны добавить для них методы и логику. Вам также понадобятся маршруты в config/routes.rb.
Я также рекомендую вам взглянуть на другие контроллеры, так как этот больше похож на средство визуализации календаря и не более того. Я также не вижу действия create (HTTP POST), что означает, что вы создаете объект где-то еще, и update и delete также должны присутствовать там (если они еще не определены).
Спасибо за ваш ответ. Я отредактировал свой вопрос с помощью представления и вспомогательного кода, а также маршрутов. Пожалуйста, дайте мне знать, как продолжить создание событий.