2012-03-16 76 views
3

我使用Ruby on Rails创建应用程序,并在管理面板中有blogsposts控制器。为管理区的路线是这样的:Rails使用博客和帖子构建方法嵌套资源

constraints :subdomain => "admin" do 
    scope :module => "admin" do 
    root to: "pages#index" 
    resources :blogs do 
     resources :posts, :controller => "posts" 
    end 
    end 
end 

我有什么http://admin.mydomain.com/blogs显示与/blogs/2/出现在以博客帖子的博客。

我想要的是当在/blogs/2/posts/new上创建一个新帖子时,blog_id被附加到帖子上。

admin/posts_controller.rb我有这个作为创建行动

def create 
    @post = Post.new(params[:post]) 

    if @post.save 
    redirect_to posts_path, notice: 'Post was successfully created.' 
    else 
    render action: "new" 
    end 
end 

在它刚刚创建帖子的时刻。我想将该帖子链接到网址中的当前博客ID - /blog/2

我怎么会去这样做呢?

回答

3

有很多方法可以做到这一点,并取决于您实际使用控制器的方式。如果您只编辑/ blogs/1/xxxx的帖子,则可以这样做:

blog_id将以params[:blog_id]的形式提供。我通常会创建一个的before_filter找到博客,然后做其他的创建操作:

before_filter do 
    @blog = Blog.find(params[:blog_id]) 
end 

def create 
    @post = @blog.posts.build(params[:post]) 
    if @post.save 
    redirect_to [@blog, @post], notice: 'Post created successfully' 
    else 
    render :action => 'new' 
    end 
end 
+0

辉煌。这工作马上,谢谢亚当:) – 2012-03-16 19:12:27

2

你想用ActiveRecord关联本的力量,这样的事情应该工作:

def create 
    @blog = Blog.find_by_id(params[:id]) 

    if @blog 
    @post = @blog.posts.new(params[:post]) 
    if @post.save 
     redirect_to posts_path, notice: 'Post was successfully created.' 
    end 
    end 

    render :new 
end 

首先找到的博客文章,这将根据您的路线将是:ID在PARAMS哈希值。接下来使用@blog.posts.new创建与该博客关联的新帖子。