无法创建路线

时间:2016-11-09 19:07:04

标签: ruby-on-rails routing

enter code here我是rails的新手,我遇到了这样的问题。这是一个错误

No route matches {:action=>"open", :controller=>"messages", :conversation_id=>"6", :id=>nil} missing required keys: [:id]

这是控制器动作

before_action :set_conversation, except:[:open]
before_action :set_message, only:[:open]

def open
  @message.open!
  respond_with @message
end

def set_conversation
  @conversation = Conversation.includes(:messages).find(params[:conversation_id])
end

def message_params
  params.require(:message).permit(:body)
end

和视图

-elsif !message.opened?
  .nontouch id="mess_#{message.id}"           
    =link_to 'Open', open_message_path(id: message.id), method: :patch, remote: true, class:'btn btn-success'

这是路线

resources :conversations do    
  resources :messages, shallow: true do
    patch :open, on: :member
  end
end

我需要一些帮助。我哪里错了?如果需要任何其他信息,请告诉我

rake routes | grep open
open_message PATCH  /messages/:id/open(.:format)                    messages#open

从路由和编辑链接中删除浅层

  =link_to 'Open', open_conversation_message_path(message.conversation.id, message.id), method: :patch, remote: true, class:'btn btn-success'

给出

No route matches {:action=>"open", :controller=>"messages", :conversation_id=>"6", :id=>nil} missing required keys: [:id]

3 个答案:

答案 0 :(得分:0)

我尝试建立下一条路线

resources :conversations do
  resources :messages do
    patch :open, on: :member
  end
end

这回报我:

$ rake routes | grep open
open_conversation_message PATCH     /conversations/:conversation_id/messages/:id/open(.:format) messages#open

这意味着您尝试使用来自特定cinversation的特定消息

目前你必须建立你的路径,如open_conversation_message_path(@conversation, @message)(使用方法PATCH)

答案 1 :(得分:0)

使用 button_to 代替链接。

  

生成一个包含单个按钮的表单,该按钮提交到由该组选项创建的URL。这是确保搜索机器人或加速器不会触发导致数据更改的链接的最安全方法。

http://apidock.com/rails/ActionView/Helpers/UrlHelper/button_to

在您看来:

<%= button_to "Open", { action: 'open', id: message.id }, method: :patch, remote: true, class: 'btn btn-success' %>

使用这种方法,您可以保留您最初的routes.rb文件:

resources :conversations do    
  resources :messages, shallow: true do
    patch :open, on: :member
  end
end

答案 2 :(得分:0)

所以这里有效= button_to "Open", { action: 'open', id: "#{message.id}" }, method: :patch, remote: true, class: 'btn btn-success' 需要插入#{message.id}