Вот что происходит:
Используя Restful маршруты, вы настроили отчет как почтовую операцию. Что кажется разумным, потому что отчет выполняет действие создания.
К сожалению, link_to не знает или даже не заботится об этом. Ссылки в основном только выполняют запросы на получение. Формы производят почтовые запросы, но в этом случае они кажутся ненужными.
У вас есть четыре варианта.
Сделайте [! ] связать кнопку в форме отправки отчета.
Нарушить рекомендации RESTful и переопределить отчет при получении запросов на получение.
Сделайте это вызовом link_to_remote. Нотабене Это зависит от javascript и не будет работать вообще, если Javascript отключен.
Добавить параметры метода к вызову link_to. Нотабене Это также зависит от javascript и будет возвращаться к запросу get, если javascript отключен.
<%= link_to "[ ! ]", report_comment_url(comment), :method => :post %>
Однако ни одно из этих решений не решит все ваши проблемы. В опубликованном вами коде есть несколько ошибок, которые вы, возможно, еще не осознали.
Во-первых:
@comment = CommentReport.new(params[:comment_report, :comment_id])
неверный синтаксис и не удастся. Есть несколько способов исправить это, предпочтительным методом является добавление: comment_id в хэш params [: comment_report], чтобы это исправить.
Т.е. передать параметры как:
params = {
:id => 4, # done by report_comment_url
:comment_report => {
:attribute1 => value1,
...
:comment_id => 4
}
}
Теперь вы можете использовать
@comment = CommentReport.new(params[:comment_report])
для желаемого эффекта.
Во-вторых:
report_comment_url не передает дополнительные параметры, поэтому ваш контроллер попытается сохранить пустую запись. Добавление comment_report к аргументам report_comment_url решит эту проблему.
Это выполнит удаленный вызов, запрашивающий действие отчета в контроллере комментариев, с хэшем параметра, необходимым для решения другой проблемы.
<%= link_to_remote "[ ! ]", report_comment_url(comment,
:comment_report => {:attribute1 => value1, ..., :comment_id => comment.id}),
:method => :post %>