Ich habe eine Rails 5 App (API-Modus). Ich boote eine Flag-Kommentar-Funktion. Ich habe ein Flag-Attribut und ein deaktiviertes Attribut zu meiner Kommentartabelle hinzugefügt (weil ich Kommentare nicht vollständig zerstören will, nur um sie auf der Vorderseite zu verstecken, wenn sie deaktiviert ist).Ich kann keine Update-Aktion an meine API von einer E-Mail senden
Wenn ein Kommentar markiert ist, sende ich eine E-Mail (über ActionMailer) an mich mit dem Kommentar, einigen Metadaten darüber und einem Link, um das deaktivierte Attribut auf "true" zu setzen.
Mein Problem ist, dass wenn ich diesen Link auf meine E-Mail klicke, das Attribut nicht aktualisiert wird. Hier
ist der Code, um klarzustellen:
routes.rb:
resources :comments, only: [:create, :update] do
member do
post 'flag'
end
end
Controller/api/v1/comments_controller.rb:
def update
@comment = Comment.find(params[:id])
new_status = @comment.disabled ? false : true
# binding.pry => I'm not even reaching that method
if @comment.update(disabled: new_status)
CommentDisabledMailer.send_comment_disabled_confirmation(@comment).deliver_now
redirect_to "https://media.giphy.com/media/YfGkjrnVIk3jq/giphy.gif" # a funny gif url
else
render json: { errors: @comment.errors.messages }, status: :unprocessable_entity
end
end
def flag
@comment.update(flagged: @comment.flagged + 1)
render json: @comment, serializer: Api::V1::CommentSerializer, status: 201, root: nil
FlagMailer.send_flag_mail(@comment).deliver_now
end
views/flag_mailer/send_flag_mail .html.erb:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
</head>
<body>
<!-- some meta data about my comment -->
<h2> <%= link_to "Disabled this comment", api_v1_comment_url(@comment), method: :put, action: :update %> </h2>
</body>
</html>
Ich erhalte die E-Mail, wenn ich den Kommentar über den Postboten auszeichne, das markierte Attribut wird aktualisiert, aber wenn ich auf "E-Mail deaktivieren" klicke, öffnet sich ein neues Fenster mit einem Fehler: No route matches [GET] "/api/v1/comments/5"
, das deaktivierte Attribut von Der Kommentar wird nicht aktualisiert und ich erhalte offensichtlich keine E-Mail, die bestätigen sollte, dass der Kommentar deaktiviert wurde (siehe update
Methode im Controller).
Fehle ich etwas?
Ihre Route eine POST-Route ist. Rails verwendet normalerweise JS, um "link_to (...) Methode:: post" durch ein Formular zu ersetzen, das beim Klicken gesendet wird (normale Links machen immer GET-Anfragen), aber Ihr Link wird außerhalb des Anwendungskontextes in einer E-Mail angezeigt , also findet keine unaufdringliche Javascript-Magie von Rail statt. Überprüfen Sie die Antworten auf diese Frage, die erklären, warum Put/Post-Anfragen in einer E-Mail nicht funktionieren: http://stackoverflow.com/questions/25573000/rails-3-2-link-to-in-email-with-method- put-still-producing-get-Anfrage – omnikron