set*_*rgo 2 ruby-on-rails ruby-on-rails-3
如果我有这样的嵌套资源:
resources :users
resources :posts
end
Run Code Online (Sandbox Code Playgroud)
和a user
has_many
posts
,Rails可以根据URL中的父关联开始编号吗?例如,目前,嵌套资源只是获取ID:
@user.posts.find(params[:id])
Run Code Online (Sandbox Code Playgroud)
这正确命名空间的帖子,只允许来自@user
...但是,有没有一种方式使其post_id
独立?IE我希望每个用户的帖子从1开始,其中:
/users/1/posts/1
/users/2/posts/1
Run Code Online (Sandbox Code Playgroud)
实际上是指两个不同的帖子?
这可能是相当多的工作,但基本上你可以通过以下步骤来做到这一点:
user_post_id
)Post
的to_param
方法,用刚刚创建的新的价值.(它必须是一个字符串.)
to_param
是url
和path
助手使用的方法.before_save
过滤器,实际上会增加user_post_id
每个新帖子的值.更改所有控制器方法以查找 user_post_id
@user = User.find(params[:user_id])
@post = @user.posts.where(:user_post_id => (params[:id])).first
Run Code Online (Sandbox Code Playgroud)您可以在此处查看源:自定义嵌套资源URL示例
移民:
class AddUserPostIdToPosts < ActiveRecord::Migration
def change
add_column :posts, :user_post_id, :integer
end
end
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
一对夫妇控制器方法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
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
248 次 |
最近记录: |