ruby-on-rails - Rails 嵌套关联和重新编号

标签 ruby-on-rails ruby-on-rails-3

如果我有这样的嵌套资源:

resources :users
  resources :posts
end

和一个 user has_many posts,是否可以让 Rails 根据 URL 中的父关联开始编号?比如目前嵌套资源只是抓取ID:

@user.posts.find(params[:id])

这正确地命名了帖子,只允许来自 @user 的帖子......但是,有没有办法让 post_id 是独立的? IE。我希望每个用户的帖子都从 1 开始,其中:

/users/1/posts/1
/users/2/posts/1

实际上指的是两个不同的帖子?

最佳答案

这可能需要相当多的工作,但基本上您可以通过以下步骤完成:

  1. 创建一个迁移以添加一个新属性来存储特定的用户帖子数。 (我使用了 user_post_id)
  2. 覆盖Postto_param 方法以使用您刚刚创建的新值。 (它必须是一个字符串。)
    • to_paramurlpath 助手使用的方法。
  3. 创建一个 before_save 过滤器,它实际上会增加每个新帖子的 user_post_id 值。
  4. 更改所有 Controller 方法以在 user_post_id 上查找

    @user = User.find(params[:user_id])
    @post = @user.posts.where(:user_post_id => (params[:id])).first
    
  5. 更改所有现在可能不起作用的 View

您可以在此处查看来源:Custom Nested Resource URL example

代码

迁移:

class AddUserPostIdToPosts < ActiveRecord::Migration
  def change
    add_column :posts, :user_post_id, :integer
  end
end

post.rb:

class Post < ActiveRecord::Base
  before_save :set_next_user_post_id
  belongs_to :user

  validates :user_post_id, :uniqueness => {:scope => :user_id}

  def to_param
    self.user_post_id.to_s
  end

private
  def set_next_user_post_id
    self.user_post_id ||= get_new_user_post_id
  end

  def get_new_user_post_id
    user = self.user
    max = user.posts.maximum('user_post_id') || 0
    max + 1
  end
end

一些 Controller 方法 posts_controller.rb:

class PostsController < ApplicationController
  respond_to :html, :xml

  before_filter :find_user

  def index
    @posts = @user.posts.all
    respond_with @posts
  end

  def show
    @post = @user.posts.where(:user_post_id => (params[:id])).first
    respond_with [@user, @post]
  end
  ...
end

关于ruby-on-rails - Rails 嵌套关联和重新编号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8752120/

相关文章:

ruby-on-rails - Ruby on Rails - 多个表中的 Where 子句

ruby-on-rails - Rails 3/Bundler gem : 'undefined method ` setup' for Bundler:Module (NoMethodError)'

ruby-on-rails - 比较 ruby​​ on rails 中的时间或开沟日期

ruby-on-rails - 在 git 中存储 Rails Assets ?备择方案?

ruby-on-rails - 为什么 Model.all 不同于 Model.where ('true' ) 在 rails 3

javascript - 使用 mechanize 和 ruby​​ 单击 javascript 选项卡

ruby-on-rails - 我可以访问在 ruby​​ on Rails 中调用实例方法的集合吗

ruby-on-rails - Rails 4 中没有计数的复数

ruby-on-rails - Rails 3 路由、Yaml 和转义 UTF-8

ruby-on-rails-3 - Roo 错误。任何解析 .ods 文件的 gem