避免使用嵌套资源,仍然可以创建正确的引用

时间:2013-05-24 08:35:54

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

我是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

是否有任何开源示例代码演示如何创建没有嵌套对象的新对象?

目前,在创建新作业时未正确设置公司参数,这意味着我无法从该处获取公司以创建作业。如何通过正确引用其公司来创建新工作?

1 个答案:

答案 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)我的对象图形是什么样的;在处理链接和表单时,我是否总是拥有父模型