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'

company.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

ジョブは 1 つの会社に属します。

ジョブ ビュー フォルダー内の _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 レベルの深さでネストしても、固有の問題はないと思います。それは本当にケースバイケースのようなものです。私にとって、入れ子のレベルを決定する際の 2 つの主要な考慮事項は、1) URL にどのようにアクセスするか、2) オブジェクト グラフはどのように見えるか、ということです。リンクとフォームを扱うとき、常に親モデルを使用しますか?

于 2013-05-24T08:45:21.680 に答える