【问题标题】:Rails build method nested resources with blogs and postsRails 使用博客和帖子构建方法嵌套资源
【发布时间】:2012-03-16 18:33:27
【问题描述】:

我正在使用 Ruby on Rails 创建一个应用程序,在管理面板中有 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

目前它只是创建一个帖子。我想将该帖子链接到 URL 中的当前博客 ID - /blog/2

我该怎么做呢?

【问题讨论】:

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


    【解决方案1】:

    有多种方法可以做到这一点,并且取决于您实际使用控制器的方式。如果您只是在 /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
    

    【讨论】:

      【解决方案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 哈希中的 :id。接下来使用@blog.posts.new 创建与该博客关联的新帖子。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-02-08
        • 1970-01-01
        • 2014-05-07
        • 2012-02-02
        • 2012-02-09
        • 2016-05-02
        • 1970-01-01
        相关资源
        最近更新 更多