为控制器操作添加路由

时间:2012-05-22 15:23:57

标签: ruby-on-rails nested-attributes nested-routes

我正在使用名为Recommendable的David Celis gem在我的rails应用程序中实现一个类似的系统。我已经把所有东西都用在了控制台上,但我找不到正确的路线,而且我得到的是“没有路线匹配[GET]”/ categories / 1 / posts / 1 / like“错误。

我的模型中有以下内容:

class Category < ActiveRecord::Base
  has_many :posts, :dependent => :destroy
  extend FriendlyId
  friendly_id :name, use: :slugged
end

class Post < ActiveRecord::Base
  belongs_to :category
end

在我的Post Controller中我有:

class PostsController < ApplicationController
  before_filter :authenticate_user!
  before_filter :get_category
  def like
    @post = Post.find(params[:id])
    respond_to do |format|
      if current_user.like @post
      else
         flash[:error] = "Something went wrong! Please try again."
         redirect_to show_post_path(@category, @post)
      end
    end
  end
end

在我的路线中,我有:

resources :categories do
    resources :posts do
      put :like, :on => :member
    end
end
match 'categories/:category_id/posts/:id', :to => 'posts#show', :as => 'show_post'

有人可以指出我的错误吗?我可以让PUT工作,但我不知道GET错误来自哪里,因为我试图重定向回帖子,如果用户喜欢某个帖子时发生错误。提前谢谢。

编辑:

在我看来,我有:

- title "#{@post.class}"
%p#notice= notice

%p
  %b Title:
  = @post.title
%p
  %b Description:
  = @post.description
%p
  %b Likes:
  = @post.liked_by.count

= link_to 'Edit', edit_category_post_path(@post)
\|
= link_to 'Back', category_posts_path
\|
= link_to 'Like', like_category_post_path(@post)

2 个答案:

答案 0 :(得分:1)

当您发出PUT请求时,您的路线需要GET个请求。

您需要通过button_to :method => :put访问您的路线,以便您的应用发出PUT请求(正确的解决方案),或更改您使用GET的路线请求(提出修改状态的请求的错误方式):

      get :like, :on => :member

答案 1 :(得分:1)

替换:

= link_to 'Like', like_category_post_path(@post)

使用:

= link_to 'Like', like_category_post_path(@category, @post), method: :put

或者,我喜欢它:

= link_to 'Like', [@category, @post], method: :put

我认为您的like必须是:

def like
  @post = Post.find(params[:id])
  respond_to do |format|
    format.html do
      if current_user.like @post
        flash[:notice] = "It's ok, you liked it!"
        redirect_to :back
      else
         flash[:error] = "Something went wrong! Please try again."
         redirect_to show_post_path(@category, @post)
      end
    end
  end
end