从url中删除控制器名称时出错

时间:2015-03-02 23:17:03

标签: ruby-on-rails ruby pins

好的,所以我有一个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

2 个答案:

答案 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