简体   繁体   中英

Rails 4 destroy action, undefined_method message_path

I have problem with Rails destroy action. I have fully working message system. User can send, read messages but can't delete it. My Message Controller is:

class MessagesController < ApplicationController
 before_filter :set_user
 def index
   if params[:mailbox] == "sent"
    @messages = @user.sent_messages.page(params[:page])
   elsif params[:mailbox] == "inbox"
    @messages = @user.received_messages.page(params[:page])
   end
 end

 def new
  @message = Message.new
  @reply_to = User.find_by_id(params[:reply_to])
  unless @reply_to.nil?
    @message.recepient_id = @reply_to.id
  end
 end

 def create
  @message = Message.new(message_params)
  @message.sender_id = @user.id
  if @message.save
   flash[:notice] = "Message has been sent"
   redirect_to user_messages_path(current_user, :mailbox=>:inbox)
  else
   render :action => :new
  end
 end

 def show
  @message = Message.readingmessage(params[:id],@user.id)
 end
 def destroy
  @message = Message.find(params[:id])
  @message.destroy
 end

private

 def message_params
  params.require(:message).permit(:sender_id, :recepient_id, :body, :subject, :read_at)
 end

 def set_user
  @user = current_user
 end
end

My Routes are:

resources :users do
  resources :messages 
end

In view I have link to delete(which is not working):

 %h2 Your Inbox
- if @messages.size == 0
  %h1 No messages in your Inbox
- else
  %table.table.table-bordered
    %tr
      %th Subject
      %th Sender
      %th Sent At
    - for message in @messages
      %tr
        %td
          - if message.read?
            = link_to h(message.subject), user_message_path(@user, message)
          - else
            = link_to "#{h(message.subject)} (unread)", user_message_path(@user, message)
        %td= "#{message.sender.name}"
        = link_to "Delete Message", @message, method: :delete, data: {confirm: "You sure?"}

When i Click this link i have following error:

No route matches [DELETE] 

rake routes for Messages:

         user_messages GET    /users/:user_id/messages(.:format)          messages#index
                       POST   /users/:user_id/messages(.:format)          messages#create
      new_user_message GET    /users/:user_id/messages/new(.:format)      messages#new
     edit_user_message GET    /users/:user_id/messages/:id/edit(.:format) messages#edit
          user_message GET    /users/:user_id/messages/:id(.:format)      messages#show
                       PATCH  /users/:user_id/messages/:id(.:format)      messages#update
                       PUT    /users/:user_id/messages/:id(.:format)      messages#update
                       DELETE /users/:user_id/messages/:id(.:format)      messages#destroy

Any ideas? :)

This is because you are using nested route for messages in routes file:

It will generate routes in association with user. So either change your path in link

= link_to "Delete Message", user_message_path(message.user, message), method: :delete, data: {confirm: "You sure?"}

Or,

define a seperate route for messages if you want to delete messages without user object:

resources :messages 

now, u will be able to use message routes individually:

= link_to "Delete Message", message, method: :delete, data: {confirm: "You sure?"}

Because you have used nested routes, you need to pass two arguments in link_to , ie both user instance and message instance. And write the named route explicitly.

Like this:

= link_to "Delete Message", user_message_path(@user, @message), \
  method: :delete, data: {confirm: "You sure?"}

作为其嵌套路径,您还需要传递用户对象。

= link_to "Delete Message", user_message_path(@message.user,@message), method: :delete, data: {confirm: "You sure?"}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM