新手问题 关于 Rails 用 REST 接口创建博客出现的问题。

dsmylv · 2013年06月23日 · 最后由 Ryan 回复于 2013年06月23日 · 3549 次阅读

在做一个社区网站,为每个用户建立一个个人博客,创建了 resource Blog,然后创建脚手架 Post。每个用户一个 Blog。 下面是 routes.rb 文件:

Railspace::Application.routes.draw do
...............
resources :blogs do 
      resources :posts
    end
root :to => 'Site#index'
 match ':controller(/:action(/:id))(.:format)'

下面是 posts.rb 文件:

class Post < ActiveRecord::Base
  attr_accessible :blog_id, :body, :created_at, :title, :updated_at
  belongs_to :blog
  validates_presence_of :title, :body, :blog
end

下面是 blog.rb 文件:

class Blog < ActiveRecord::Base
  attr_accessible :blog_id
  belongs_to :user
  has_many   :posts ,:order => "created_at DESC"
end

下面这个是 posts_controller.rb,在多加了一个方法,其他的代码没动过。

class PostsController < ApplicationController
  before_filter :protect, :protect_blog
......
  private
  def protect_blog
    @blog = Blog.find(params[:id])
    user = User.find(session[:user_id])
   unless @blog.user == user
      flash[:notice] = "This is not your blog!"
    redirect_to :action => "index", :controller => "user"
     return flase
   end
  end
end

下面的超链接里应该填什么?试了 posts_path(blog),显示找不到 posts 方法。 <%= link_to 'blog' -%> 而且我明明已经在 blog.rb 中加了 has_many 方法,可是当我在 post 控制器的 index 方法中加“ @pages,@posts = paginate(@blog.posts)”就提示有错:找不到 posts 方法。

为什么???

no route matches post这个错误么?

#1 楼 @Ryan 其实有好几个错误。我都不知道哪个是哪个了!

#3 楼 @dsmylv 因为你使用了 nested resources。post 在 blog 的 resources 里面,所以,如果你想用 posts_path 应该是没有的。你 run 一下bundle exec rake routes,看下你的路由规则,应该是类似blog_posts_path这样。rails 里面有规定,任何一个路由都必须初始化对应的 controller。所以当你的 url 里面没有 blog 的时候,光用 post 是不行的。内嵌路由有些不可预知的隐藏陷阱。所以慎用。

#4 楼 @Ryan 好我再来试试。

#4 楼 @Ryan <%= link_to 'blog', blog_posts_path(@blog.posts) -%> 错误: 'undefined method `posts' for nil:NilClass'

#6 楼 @dsmylv 你的@blog是个空值。

#7 楼 @Ryan 下面是 user_controller.rb

def index
  @title="User Hub"
  @user = User.find(session[:user_id])
  @spec = @user.spec ||=Spec.new
  @blog = @user.blog ||=Blog.new
   @blog.posts.build
end

应该怎么做

#6 楼 @dsmylv 你先定位到你是哪行代码的@blog是空值,然后是什么导致的。这样看代码我也看不出来。

#9 楼 @Ryan 点击 blog 超链接只有提示::: undefined methodposts' for nil:NilClass` Extracted source (around line #17):

14:     &nbsp;<%= nav_link '帮助', 'site', 'help' -%>&nbsp;
15:     </span>
16:     <span style="float:right">
17:     <% if session[:user_id] -%>
18:     &nbsp;<%= nav_link '个人中心','user','index' -%>&nbsp;|
19:     &nbsp;<%= link_to 'blog', blog_posts_path(@blog.posts) -%>&nbsp;| 
20:     &nbsp;<%= nav_link '登出','user','logout' -%>&nbsp;

我也分不清....

#10 楼 @dsmylv gem "better_errors",你装个这个 gem,再测。

需要 登录 后方可回复, 如果你还没有账号请 注册新账号