Rails使用博客和帖子构建方法嵌套资源

时间:2012-03-16 18:33:27

标签: ruby-on-rails ruby-on-rails-3 ruby-on-rails-3.1 blogs

我正在使用Ruby on Rails创建一个应用程序,在Admin面板中有blogsposts个控制器。管理区域的路由如下所示:

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

我将如何做到这一点?

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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 

首先找到博客文章,根据你的路线将会是:params hash中的id。接下来使用@blog.posts.new创建与该博客相关联的新帖子。