我的申请包含3个模型user
company
和post
。
我在弄清楚逻辑
时遇到了麻烦用户可以有很多公司,公司可以有很多帖子。
这是我的模特
class user < ActiveRecord::Base
has_many :companies
end
class company < ActiveRecord::Base
belongs_to :user
has_many :posts
end
class post < ActiveRecord::Base
belongs_to :company
end
注意:公司有user_id,post表中有company_id
如何确保在创建帖子时自动记录company_id
额外信息:对于路线,它将是resources :jobs
和resources :companies
- 更新 -
发布控制器
def new
Post.new(post_params)
end
def create
Post.new(post_params)
if @post.save
redirect_to @post
else
render 'new'
end
end
路由
resources :companies
resources :posts
答案 0 :(得分:1)
我想我可能会在posts
中嵌套companies
,因此您可以在参数中找到company_id
。
注意如果您这样做,您的路径名称将会改变。
的routes.rb
resources :companies do
resources :posts
end
posts_controller.rb
def create
@company = Company.find(params[:company_id])
@post = @company.posts.build(post_params)
...
end
既然你想在控制器中找到每个动作的公司,你可以稍微重构一下。
class PostsController
before_action :set_company
def index
@post = @company.posts
end
def create
@post = @company.posts.build(post_params)
...
end
...
...
private
def set_company
@company = Company.find(params[:company_id])
end
end
答案 1 :(得分:0)
我想到了两个选项。
您可以在company_id
视图中创建一个隐藏的posts#new
字段,因此它会与您的参数一起自动发送,因此会相应地设置在模型中(前提是您允许它) )。但在这种情况下,您需要在创建@post
时在控制器中填充该字段。就像这样:
@post = Post.new(company_id: some_company_id)
使用嵌套资源。首先将路由更改为:
resources :companies do
resoures :posts
end
这样,当您查看rake routes
输出时,您会看到在请求网址中设置了:company_id
参数。因此,当您继续创建帖子时,您可以执行@post.company_id = params[:company_id]
并完成任务。