2

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

公司.rb

class Company < ActiveRecord::Base
  attr_accessible :name
  has_many :jobs, :dependent => :destroy
end

工作.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

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

现在,创建新工作时没有正确设置公司参数,这意味着我无法从那里获取公司来创建工作。我如何创建一个正确引用其公司的新工作?

4

1 回答 1

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)如何访问 url 2)我的对象图是什么样的;在处理链接和表单时,我是否总是有父模型

于 2013-05-24T08:45:21.680 回答