我是Ruby On Rails的新手,并按照RoR指南创建了一个博客:http://guides.rubyonrails.org/getting_started.html
根据不同的文章,我应该避免资源嵌套多个级别。 (http://guides.rubyonrails.org/routing.html#nested-resources 2.7.1)
他们参考了有关最佳做法的文章:http://weblog.jamisbuck.org/2007/2/5/nesting-resources
目前我的项目中没有嵌套资源,如何正确创建表单以正确设置引用?
我的routes.rb文件
Monitoring::Application.routes.draw do
resources :companies
resources :jobs
root :to => 'companies#index'
company.rb
class Company < ActiveRecord::Base
attr_accessible :name
has_many :jobs, :dependent => :destroy
end
job.rb
class Job < ActiveRecord::Base
belongs_to :company
attr_accessible :interval, :name
end
一份工作属于一家公司。
_form.html.erb在作业视图文件夹
中<%= form_for @job, :html => { :class => 'form-horizontal' } do |f| %>
<div class="control-group">
<%= f.label :name, :class => 'control-label' %>
<div class="controls">
<%= f.text_field :name, :class => 'text_field' %>
</div>
</div>
<div class="control-group">
<%= f.label :interval, :class => 'control-label' %>
<div class="controls">
<%= f.number_field :interval, :class => 'number_field' %>
</div>
</div>
<div class="form-actions">
<%= f.submit nil, :class => 'btn btn-primary' %>
<%= link_to t('.cancel', :default => t("helpers.links.cancel")),
jobs_path, :class => 'btn' %>
</div>
<% end %>
要实际创建作业并引用其公司,我尝试了以下代码
def new
@company = Company.find(params[:company])
@job = @company.jobs.build
respond_to do |format|
format.html # new.html.erb
end
end
是否有任何开源示例代码演示如何创建没有嵌套对象的新对象?
目前,在创建新作业时未正确设置公司参数,这意味着我无法从该处获取公司以创建作业。如何通过正确引用其公司来创建新工作?
答案 0 :(得分:3)
不进行嵌套路由,您只需在公司ID的表单中删除隐藏的输入。
<%= f.hidden_field :company_id, value: @company.id %>
然而,这显然很容易受到客户的攻击。如果权限是一个问题,那么你应该只设置它服务器端:
@job = Job.new(company_id: @company.id)
如果你需要进行质量分配:
@job = Job.new(params[:job].merge(company_id: @company.id))
#or do it after the fact
@job = Job.new(params[:job])
@job.company_id = @company.id
顺便说一句,我认为嵌套资源2或甚至3级深度没有固有的问题。它真的是一个个案的事情。对我来说,决定嵌套级别时的两个主要考虑因素是1)如何访问网址2)我的对象图形是什么样的;在处理链接和表单时,我是否总是拥有父模型