2015-06-19 2 views
1

Итак, у меня есть простой список сообщений, которые пользователи могут отправлять. Я пытаюсь поместить кнопку удаления (которая работает) для каждого сообщения. Но, как вы можете видеть, here вы получаете ошибку об совершенно другом действии, если вы нажмете кнопку. Я не совсем уверен, где я ошибся. Я предполагаю, что я не в своей глубине в области контроллера. Вот все необходимые файлы.Попытка удалить сообщение из списка с рельсами

routes.rb:

Rails.application.routes.draw do 
root 'messages#index', as: :home 
get '/new' => 'messages#new', as: :edit 
resources :messages 
post '/new' => 'messages#create', as: :create 
delete 'messages/:id' => 'messages#destroy', as: :delete 

Соответствующий контроллер:

class MessagesController < ApplicationController 
    def index 
     @messages=Message.all 
    end 
    def new 
     @messages=Message.new 
    end 
    def destroy 
     @messages=Message.find(params[:id]) 
     @messages.destroy 
    end 
    def create 
     @messages = Message.new(message_params) 
      if @messages.save 
      redirect_to '/' 
       else 
      render 'new' 
      end 
    end 
    private 
    def message_params 
     params.require(:message).permit(:content, :subject) 
    end 

end 

Соответствующий Вид:

<div class="main"> 
    <div="messages"> 
     <%@messages.each do |t|%> 
     <h2 class="subject"><%=t.subject%></h2> 
     <p class="content"><%=t.content%></p> 
     <%=link_to "Delete Message", delete_path(t)%> 
     <% end %> 
     <%=link_to "Create Message", edit_path%> 
    </div> 
</div> 
+0

Ваша ссылка просто нормальная связь, которая выполняет HTTP 'GET'. Вам нужно будет прочитать методы HTTP и Rails. – fylooi

+0

delete 'messages /: id' => 'messages # destroy', as:: delete изменить this to - get 'messages /: id' => 'messages # destroy', –

+0

Изменение его для удаления 'messages /: id. ..etcetc ничего не меняет –

ответ

2

Вам необходимо пройти метод DELETE, а также, в противном случае он будет выполните простой запрос GET. Вот как:

<%=link_to "Delete Message", delete_path(t), :method => 'delete' %> 

Помните, что если вы не упоминать, method в link_to, по умолчанию будет рассматриваться как GET. Поэтому вы должны быть откровенными в отношении других методов HTTP.

Edit:

Либо использовать resources :messages или использовать маршруты, которые вы написали сами. Использование resources :messages немного проще, и это предпочтительный способ.

Используя resources :messages, вы должны написать:

<%= link_to "Delete Message", t, :method => 'delete' %> 

Edit 2:

Вы получаете ошибку Template is missing, потому что в вашем методе destroy, ни вы не render Инг ничего, ни вы, redirect_to ничего. После вас destroy объект, вы должны будете сказать, куда он должен идти. Подобно этому, если вы хотите, чтобы пользователь идти страницу сообщений после того, как он/она destroy s запись, вам необходимо добавить следующую строку в конец метода:

redirect_to messages_path 
+0

Я сделал это, теперь я получаю гораздо большую ошибку, от внешнего источника. –

+0

Хорошо, на самом деле! Это работает, но когда я нажимаю кнопку, я получаю сообщение об ошибке, но если я вернусь и перезагружу страницу, сообщение исчезнет. –

+0

Вы написали 'resources: messages', и сами создаете маршруты. Зачем? 'resources: messages' будет генерировать все маршруты CURD для вас. –

Смежные вопросы