好的,所以我有一个rails应用程序,用户可以创建别针。然后他们可以评论那些引脚。我该怎么做是删除pin url中的控制器名称。
所以代替:http://localhost:3000/pins/name我有http://localhost:3000/name
**我在** config / routes.rb ****
中使用了这个Rails.application.routes.draw do
resources :pins, :only => [:index, :new, :create], :path => '' do
resources :comments
member do
put 'upvote'
end
end
但是现在,当我尝试评论一个引脚时,我有这个错误:
wrong constant name 'pin name'
错误来自于我的comments_controller.rb:
def load_commentable
resource, id = request.path.split('/')[1, 2]
@commentable = resource.singularize.classify.constantize.friendly.find(id)
end
我有什么想法可以解决这个问题吗?
修改
**rake routes** output:
pin_comments GET /:pin_id/comments(.:format) comments#index
POST /:pin_id/comments(.:format) comments#create
new_pin_comment GET /:pin_id/comments/new(.:format) comments#new
edit_pin_comment GET /:pin_id/comments/:id/edit(.:format) comments#edit
pin_comment GET /:pin_id/comments/:id(.:format) comments#show
PATCH /:pin_id/comments/:id(.:format) comments#update
PUT /:pin_id/comments/:id(.:format) comments#update
DELETE /:pin_id/comments/:id(.:format) comments#destroy
答案 0 :(得分:0)
使用params
(带请求参数的哈希值)代替resource, id = request.path.split('/')[1, 2]
。这应该可以解决你的第二个问题。
答案 1 :(得分:0)
我认为你可能来自一个php背景或类似的东西,因为我曾经想过当我使用php我自己时,但在rails中你不会触摸URI或尝试解析它或任何东西,这是路由器的工作,如果它到达了你的代码的那部分,那么工作已经完成。
如果您使用pin的名称作为url,那么您应该使用friendly_id gem,或者设置模型的to_param
方法。
引脚的ID将始终位于params[:pin_id]
中,因为它是如何在路由中命名的,注释的ID将位于params[:id]
中,请注意路径中的变量名称
/:pin_id/comments/:id
我不确定你的资源是什么意思,但如果你的意思是模型名称,那么你就是一个pin的控制器,所以可以安全地假设它是一个pin模型,但如果你想要它的名字然后你可以访问params[:controller]
修复所有内容后,load_commentable
方法可能会如下所示
def load_commentable
@commentable = Pin.find(params[:pin_id]).comments.where(id: params[:id])
end