2012-01-24 15 views
1

私はレール初心者ですので、これで私と一緒に裸です...要するに、IPアドレスを持つサービス(サーバー)を追跡するアプリケーションがあります。Rails 3ネストされた属性?

  • 彼らが利用可能に分類している、その後のservice_idを持っていない場合は、すべてのIPアドレスは、見上げている:私は新しいサービスを作成するときに、次の問題が発生したように、私は何をしようとしているが、それを設定されています新しいサービスページの選択ボックスに戻ります。
  • ユーザが選択ボックスから1つ以上のIPアドレスを選択し、残りの必要なサービスデータを入力した後、送信時に各IPアドレスが作成されたサービスのservice_idで更新されます。 (そのIPが取られているとマークされるように)。

私は理解したように、私はこれは、ネストされた属性または仮想属性のいずれかで可能であるべきだと思う...しかし、私はわかりません。

class Service < ActiveRecord::Base 
    has_many :ips 
    attr_accessor :service_ips 
end 

class Ip < ActiveRecord::Base 
    belongs_to :service 
end 

コントローラーそうのように:

は、私はそうのようなモデルを持っている

class ServicesController < ApplicationController 
def new 
    @available_ips = Ip.where(:service_id == nil) 
end 

そしてそうのようなビュー:

<%= form_for(@service) do |f| %> 
    <%= f.label :service_ips %> 
    <%= f.collection_select(:service_ips, @available_ips, :id, :address, { }, {:multiple => true, :size => 5}) %> 

    <%= f.label :hostname %><br /> 
    <%= f.text_field :hostname, :size => 40 %> 

    <%= f.submit :id => "submit"%> 
<% end %> 

は、どのように私はそれがため、各IPを選択しますか新しく作成されたservice_idで更新されますか?

ご協力いただきありがとうございます。

答えて

2

これは実際にネストされた属性ではなく、仮想属性も必要ありません。あなたは多面的な関係を編集しているだけです。

まず、編集/更新アクションを使用してRESTfulにしたいとします。 routing guideをお読みください。あなたのroutes.rbをで

:次に

resources :services 

class ServicesController 
    def edit 
    @service = Service.find(params[:id]) 
    @available_ips = Ip.where(:service_id => nil) 
    end 

    def update 
    @service = Service.find(params[:id]) 
    if @service.update_attributes params[:service] 
     redirect_to @service 
    else 
     render :edit 
    end 
    end 
end 

あなたはあなたのモデルにアクセサを必要としない、コレクションがアクセサです:

class Service < ActiveRecord::Base 
    has_many :ips 
end 

class Ip < ActiveRecord::Base 
    belongs_to :service 
end 

あなたのビュー/サービス/ edit.html.erbで:

<%= form_for(@service) do |f| %> 
    <%= f.label :ips %> 
    <%= f.collection_select(:ip_ids, @available_ips + @service.ips, :id, :address, { }, {:multiple => true, :size => 5}) %> 

    <%= f.label :hostname %><br /> 
    <%= f.text_field :hostname, :size => 40 %> 

    <%= f.submit :id => "submit" %> 
<% end %> 
+0

ありがとう、あなたの答えは、私の頭の中で関係について明確な事柄を助けました...私が "ActiveRecord :: AssociationTypeMismatch" - > Ip(#2253505960)文字列(#2241209340)。私の作成アクション(原因は疑いがあります)は、次のとおりです。 '@user = current_user' '@service = @ user.services.create(params [:service])' –

+1

残念ですが、 'collection_select:ip_ids 'あなたが実際にids(整数)の配列を編集しているからです。答えに訂正されました。 – sj26

関連する問題