【发布时间】:2015-11-24 00:15:04
【问题描述】:
我来了
ActionView::Template::Error(没有路由匹配 {:action=>"to_approve", :controller=>"microposts", :id=>nil} 缺少必需的键:[:id]):
没有路线匹配 {:action=>"to_approve", :controller=>"microposts", :id=>nil} 缺少必需的键:[:id]
但这没有意义,因为我正在路由到不同的路由
路由.rb
match '/microposts/:id/approve', to: 'microposts#to_approve' , via: [:get, :post], as: 'approve_micropost'
match '/microposts/to_approve', to: 'microposts#approve' , via: :get
controller.rb
def show
@tag = Tag.find(params[:id])
@microposts = @tag.microposts
end
show.html.rb
<%= render @microposts %>
_micropost.html.rb - 这是显示错误的行
<% if is_an_admin? %>
<%= link_to "Approve", approve_micropost_path(micropost.id) %>
<% end %>
micropost_controller.rb
def approve
@microposts = Micropost.unapproved
end
def to_approve
micropost = Micropost.unapproved_by_id(params[:id])
if micropost.update_attributes(approved: true)
flash[:success] = "Approved!"
else
flash[:error] = "Not approved!"
end
redirect_back_or microposts_to_approve_path
end
微博.rb
default_scope { where(approved: true).order('microposts.created_at DESC')}
def self.unapproved
self.unscoped.all.where(approved: false).order('microposts.created_at DESC')
end
def self.unapproved_by_id(id = nil)
self.unscoped.all.where(id: id)
end
你可以看到它试图用:id创建microposts_to_approve_path,这显然不存在,但我写了approve_micropost_path。
我错过了什么?
另外,在microposts_to_approve_path 的路由中,我允许[:get, :post] 虽然我只想允许通过on_click 事件(发布?)访问to_approve 方法并且没有视图。我应该如何重写这个?
rake routes:
microposts POST /microposts(.:format) microposts#create
micropost DELETE /microposts/:id(.:format) microposts#destroy
approve_micropost GET|POST /microposts/:id/approve(.:format) microposts#to_approve
microposts_to_approve GET /microposts/to_approve(.:format) microposts#approve
在错误页面,参数:
Request
Parameters:
{"id"=>"4",
"name"=>"tag name"}
解决方案
问题是因为我使用了default_scope,而我正在使用的对象不正常。
修复前
@microposts = @tag.microposts #@microposts is CollectionProxy
之后
@microposts = @tag.microposts.all #@microposts is AssociationRelation
一旦我更改为.all,问题就解决了。
顺便说一句,这是一个错误吗?在我看来,default_scope 不应该改变默认行为..
【问题讨论】:
-
显示你的
rake routes结果 -
请出示您的参数。
标签: ruby-on-rails ruby-on-rails-4 actionview