Ссылка для решения проблемы - PullRequest
0 голосов
/ 11 ноября 2009

У меня проблема с приложением.

У меня есть отчет таблицы, есть 2 столбца, user_id и comment_id Я создал ссылку на просмотр комментария к статье

<%= link_to "[ ! ]", report_comment_url(comment) %>

class CommentsController < ApplicationController

  def report
    @comment = Comment.find(params[:id])
    @comment = CommentReport.new(params[:comment_report, :comment_id])
    if @comment_report.save
      redirect_to :back
    end
    redirect_to :back
  end
end

но это была ошибка

ActionController :: MethodNotAllowed

Разрешены только почтовые запросы.

Есть ли у вас какие-либо предложения о том, как разместить в таблице отчетов идентификатор current_user и comment_id?

Ответы [ 3 ]

0 голосов
/ 11 ноября 2009

Вот что происходит:

Используя Restful маршруты, вы настроили отчет как почтовую операцию. Что кажется разумным, потому что отчет выполняет действие создания.

К сожалению, link_to не знает или даже не заботится об этом. Ссылки в основном только выполняют запросы на получение. Формы производят почтовые запросы, но в этом случае они кажутся ненужными.

У вас есть четыре варианта.

  1. Сделайте [! ] связать кнопку в форме отправки отчета.

  2. Нарушить рекомендации RESTful и переопределить отчет при получении запросов на получение.

  3. Сделайте это вызовом link_to_remote. Нотабене Это зависит от javascript и не будет работать вообще, если Javascript отключен.

  4. Добавить параметры метода к вызову 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 %> 
0 голосов
/ 11 ноября 2009

params [: comment_report] - ноль, потому что в вашем выражении link_to нет ссылки на это. Поскольку вы упоминаете в комментарии, что ваш взгляд:

<%= link_to "[ ! ]", report_comment_url(comment), :comment_id => comment.id, :user_id => comment.user_id %>

Тогда вам нужно это в вашем контроллере:

@comment_report = CommentReport.new(:user_id => params[:user_id], :comment_id => params[:comment_id]) 

Но я согласен с NSD, что link_to_remote будет работать лучше для того, чего вы хотите достичь (то есть создать новую запись и вернуть пользователя на страницу). Вы также устраните необходимость в своем операторе @comment = Comment.find (params [: id]).

0 голосов
/ 11 ноября 2009

Учитывая то, что я предполагаю, что вы пытаетесь достичь, я бы предложил вам использовать link_to_remote

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...