0

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

但是现在,当我尝试评论 pin 时,我遇到了这个错误:

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
4

2 回答 2

0

使用params(Hash with request parameters) 而不是resource, id = request.path.split('/')[1, 2]. 这应该可以解决您的第二个问题。

于 2015-03-02T23:19:35.300 回答
0

我想你可能来自 php 背景或类似的东西,因为我曾经在我自己使用 php 时这样想,但是在 Rails 中你不会触摸 URI 或尝试解析它或任何东西,那就是路由器的工作,如果它到达了你代码的那部分,那么工作就已经完成了。

如果您使用 pin 的名称作为 url,那么您应该使用 friendly_id gem,或者设置to_param模型的方法。

pin 的 id 将始终在,params[:pin_id]因为这就是它在路由中的命名方式,并且注释的 id 将在params[:id],注意路由中的变量名

/:pin_id/comments/:id

我不确定您所说的资源是什么意思,但是如果您指的是模型名称,那么您就在引脚的控制器中,因此可以安全地假设它是引脚模型,但是如果您想要控制器的名称,那么您可以访问params[:controller]

修复所有内容后,您的load_commentable方法可能看起来像这样

def load_commentable
  @commentable = Pin.find(params[:pin_id]).comments.where(id: params[:id])
end
于 2015-03-03T23:28:37.123 回答