【问题标题】:Rails 4 destroy action, undefined_method message_pathRails 4 销毁动作,未定义方法 message_path
【发布时间】:2013-08-23 11:12:49
【问题描述】:

我对 Rails 销毁操作有疑问。我有完整的消息系统。用户可以发送、阅读消息但不能删除它。 我的消息控制器是:

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

我的路线是:

resources :users do
  resources :messages 
end

鉴于我有删除链接(不起作用):

 %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?"}

当我点击此链接时,出现以下错误:

No route matches [DELETE] 

消息路由:

         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

有什么想法吗? :)

【问题讨论】:

  • 你想要message而不是@message
  • 要使删除方法起作用,您必须正确加载 javascripts。在您的浏览器中看到,在 firebug 或 chrome 开发人员工具控制台中,所有文件都正确加载。你能粘贴你的rake routes 命令输出吗?
  • 当我将@mesaage 更改为消息时,我有未定义的方法`message_path' 错误。

标签: ruby-on-rails ruby ruby-on-rails-3 ruby-on-rails-4


【解决方案1】:

这是因为您在路由文件中使用嵌套路由来处理消息:

它将生成与用户关联的路由。所以要么改变你的链接路径

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

或者,

如果要删除没有用户对象的消息,请为消息定义单独的路由:

resources :messages 

现在,您将能够单独使用消息路由:

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

【讨论】:

  • 当我使用: = link_to "Delete Message", user_message_path(message.user, message), method: :delete, data: {confirm: "You sure?"} 我有未定义的方法@ 987654324@user' 为 nil:NilClass。什么鬼?
  • @MateuszUrbański 你在用户和消息之间有关联吗?你能粘贴你的 message.rb 文件吗?
  • 关联没问题,因为用户可以发送和阅读消息,我为它写了测试,没关系。 message.rb: belongs_to :sender, class_name: 'User', primary_key: 'id', foreign_key: 'sender_id' belongs_to :recepient, class_name: 'User', primary_key: 'id', foreign_key: 'recepient_id'
  • 在这种情况下,您可以使用 message.sender 而不是 message.user。但更好的是为外部用户的消息编写单独的路由,我在回答中的第二种方法中提到过。
【解决方案2】:

作为它的嵌套路径,你还需要传递用户对象..

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

【讨论】:

    【解决方案3】:

    因为你使用了嵌套路由,你需要在link_to中传递两个参数,即用户实例和消息实例。并显式编写命名路由。

    像这样:

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

    【讨论】:

    • 感谢帮助,但现在我遇到了同样的错误:没有路由匹配 [DELETE] "/users/1-jan-kowalski/messages"
    • @MateuszUrbański,生成的 html 是否正确?即带有 DELETE 方法的表单?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-18
    • 1970-01-01
    相关资源
    最近更新 更多