Rails路由错误:没有路由匹配[GET]“/ conversations /'id'/ reply”

时间:2014-06-08 19:21:13

标签: ruby-on-rails routing mailboxer

我无法在Rails 4中回复与Mailboxer gem的对话。这个宝石上没有很多文档,或者我可能没有足够的经验,但我&# 39;现在已经坚持了一段时间。

查看/会话/索引: (显示所有当前用户对话的列表)

<% @conversations.each do |conversation| %>
<%= link_to conversation.subject, reply_conversation_path(conversation.id) %>
<%= conversation.updated_at.strftime("%a, %m/%e/%Y %I:%M %p") %>
<%= link_to "Move to Trash", {:controller => "conversations", :action => 
    "trash", :id => conversation.id}, :title=> "Move to Trash", :method=>'post' %>
<% end %>

当我点击上面视图中的第一个link_to时,收到路由错误:No route matches [GET] "/conversations/68/reply"

我希望让它呈现以下视图,并将正确的对话传递给它:

查看/消息/ _form / (用于回复现有的对话)

Reply:
<%= form_for :message, url: [:reply, conversation] do |f| %>
<%= f.text_area :body %>
<%= f.submit "Send Message", class: 'btn btn-primary' %>
<%= submit_tag 'Clear Reply Box', type: :reset, class: 'btn btn-danger' %>
<% end %>

路线:

resources :users
root to: 'profiles#index'

resources :messages do
  member do
      post :new
  end
end
resources :conversations do
  member do
      post :reply
      post :trash
      post :untrash
  end
  collection do
      get :trashbin
      post :empty_trash
  end
end

对话控制器:

class ConversationsController < ApplicationController
before_filter :authenticate_user!
helper_method :mailbox, :conversation
def index
    @conversations ||= current_user.mailbox.inbox.all
end

def reply
    current_user.reply_to_conversation(conversation, *message_params(:body, :subject))
    redirect_to conversation
end

def trashbin
    @trash ||= current_user.mailbox.trash.all
end

def trash
    conversation.move_to_trash(current_user)
redirect_to :conversations
end

def untrash
    conversation.untrash(current_user)
redirect_to :back
end

def empty_trash
    current_user.mailbox.trash.each do |conversation|
        conversation.receipts_for(current_user).update_all(:deleted => true)
    end
redirect_to :conversations
end

private

def mailbox
    @mailbox ||= current_user.mailbox
end

def conversation

    @conversation ||= mailbox.conversations.find(params[:id])
end

def conversation_params(*keys)
    fetch_params(:conversation, *keys)

end

def message_params(*keys)
    fetch_params(:message, *keys)
end

def fetch_params(key, *subkeys)
    params[key].instance_eval do
        case subkeys.size
            when 0 then self
            when 1 then self[subkeys.first]
            else subkeys.map{|k| self[k] }
        end
    end
end
end

消息控制器:

class MessagesController < ApplicationController

# GET /message/new
def new

    @request = Request.find(params[:request])
    @message = current_user.messages.new
    @user = @request.user
end

# POST /message/create
def create

@user = User.find(params[:user])
@body = params[:body]
@subject = params[:subject]

current_user.send_message(@user, params[:body], params[:subject])
flash[:notice] = "Message has been sent!"
redirect_to :conversations
end
end

相关的佣金路线:

                    users GET    /users(.:format)                     users#index
                      POST   /users(.:format)                     users#create
             new_user GET    /users/new(.:format)                 users#new
            edit_user GET    /users/:id/edit(.:format)            users#edit
                 user GET    /users/:id(.:format)                 users#show
                      PATCH  /users/:id(.:format)                 users#update
                      PUT    /users/:id(.:format)                 users#update
                      DELETE /users/:id(.:format)                 users#destroy
                 root GET    /                                    profiles#index
              message POST   /messages/:id(.:format)              messages#new
             messages GET    /messages(.:format)                  messages#index
                      POST   /messages(.:format)                  messages#create
          new_message GET    /messages/new(.:format)              messages#new
         edit_message GET    /messages/:id/edit(.:format)         messages#edit
                      GET    /messages/:id(.:format)              messages#show
                      PATCH  /messages/:id(.:format)              messages#update
                      PUT    /messages/:id(.:format)              messages#update
                      DELETE /messages/:id(.:format)              messages#destroy
   reply_conversation POST   /conversations/:id/reply(.:format)   conversations#reply
   trash_conversation POST   /conversations/:id/trash(.:format)   conversations#trash
 untrash_conversation POST   /conversations/:id/untrash(.:format) conversations#untrash
trashbin_conversations GET    /conversations/trashbin(.:format)    conversations#trashbin
empty_trash_conversations POST   /conversations/empty_trash(.:format) conversations#empty_trash
        conversations GET    /conversations(.:format)             conversations#index
                      POST   /conversations(.:format)             conversations#create
     new_conversation GET    /conversations/new(.:format)         conversations#new
    edit_conversation GET    /conversations/:id/edit(.:format)    conversations#edit
         conversation GET    /conversations/:id(.:format)         conversations#show
                      PATCH  /conversations/:id(.:format)         conversations#update
                      PUT    /conversations/:id(.:format)         conversations#update
                      DELETE /conversations/:id(.:format)         conversations#destroy

我一直在关注本教程:http://jamestansley.com/2014/02/22/customizing-the-mailboxer-ruby-gem-2/

如果我遗漏了任何东西,请点击此处查看我的github回购: https://github.com/portOdin/GoFavorIt-Heroku/tree/stackflow/app

2 个答案:

答案 0 :(得分:2)

路线是post路线:

resources :conversations do
  member do
      post :reply

您的表单需要使用HTTP POST请求,并且因为您没有指定方法,所以它默认为GET请求。

替换此......

<%= form_for :message, url: [:reply, conversation] do |f| %>

用这个:

<%= form_for :message, url: [:reply, conversation], method: :post do |f| %>

答案 1 :(得分:0)

您的佣金路线显示reply_conversation POST /conversations/:id/reply(.:format) conversations#reply,但您的link_to会发送get个请求。您需要更改路线以使其成为获取请求。