복붙노트

[RUBY-ON-RAILS] 레일 형태로 여러 개체

RUBY-ON-RAILS

레일 형태로 여러 개체

나는 하나 개의 형태로 내 모델 사진 편집 여러 항목에합니다. 나는 컨트롤러의 업데이트 작업의 항목을 수집하는 방법뿐만 아니라, 형태로이 제대로 존재하고 POST하는 방법에 대한 확신입니다.

이것이 내가 원하는거야:

<form>
<input name="photos[1][title]" value="Photo with id 1" />
<input name="photos[2][title]" value="Photo with id 2" />
<input name="photos[3][title]" value="Custom title" />
</form>

내가 위에서 언급 한 것처럼 매개 변수, 그냥 예입니다 : 내가 POST이 양식이 값에 가장 좋은 방법을 모르겠습니다.

컨트롤러에서 나는 이런 식으로 뭔가를 원하는 :

@photos = Photo.find( params[photos] )
@photos.each do |photo|
    photo.update_attributes!(params[:photos][photo] )
end

해결법

  1. ==============================

    1.레일 4에서, 그냥이

    레일 4에서, 그냥이

    <%= form_tag photos_update_path do %>
      <% @photos.each do |photo| %> 
        <%= fields_for "photos[]", photo do |pf| %>
          <%= pf.text_field :caption %>
          ... other photo fields
    
  2. ==============================

    2.레일이 작업을 수행하려면 많은 당신을 도움이 될 수 없습니다. 당신이보기 컨트롤러, 심지어 루트에서 해결을해야 할 것이다, 그래서 그것은 표준보기 규칙에 간다. 그건 재미 없다.

    레일이 작업을 수행하려면 많은 당신을 도움이 될 수 없습니다. 당신이보기 컨트롤러, 심지어 루트에서 해결을해야 할 것이다, 그래서 그것은 표준보기 규칙에 간다. 그건 재미 없다.

    다중 모델 형태의 레일 방식으로 거래의 주요 자원은 스티븐 추의 PARAMS-foo는 일련의, 또는 당신은 레일 2.3에 있다면, 중첩 된 개체 양식 확인

    당신이 Photoset처럼 편집하는 것을 단수 자원의 어떤 종류를 정의하는 경우가 훨씬 쉬워집니다. Photoset는 모델의 실제, 액티브 형이 될 수 아니면 그냥 데이터를 받아서는 액티브 모델 인 것처럼 오류를 발생 외관이 될 수 있습니다.

    지금 당신은 다음과 같이 다소보기 양식을 작성할 수 있습니다 :

    <%= form_for :photoset do |f|%>
      <% f.object.photos.each do |photo| %>
        <%= f.fields_for photo do |photo_form| %>
          <%= photo_form.text_field :caption %>
          <%= photo_form.label :caption %>
          <%= photo_form.file_field :attached %>
        <% end %>
      <% end %>
    <% end %>
    

    귀하의 모델로 제공 각 자식 사진을 확인하고 자신의 오류를 집계한다. 당신은 모든 클래스에서 검증을 포함하는 방법에 대한 좋은 기사를 체크 아웃 할 수 있습니다. 그것은 다음과 같이 보일 수 있습니다 :

    class Photoset
      include ActiveRecord::Validations
      attr_accessor :photos
    
      validate :all_photos_okay
    
      def all_photos_okay
        photos.each do |photo|
          errors.add photo.errors unless photo.valid?
        end
      end
    
      def save
        photos.all?(&:save)
      end
    
      def photos=(incoming_data)
        incoming_data.each do |incoming|
           if incoming.respond_to? :attributes
             @photos << incoming unless @photos.include? incoming
           else
             if incoming[:id]
                target = @photos.select { |t| t.id == incoming[:id] }
             end
             if target
                target.attributes = incoming
             else
                @photos << Photo.new incoming 
             end
           end
        end
      end
    
      def photos
         # your photo-find logic here
        @photos || Photo.find :all
      end
    end
    

    Photoset의 외관 모델을 사용하면 전용 모델의 가장 복잡한 코드를 예약, 간단한 컨트롤러와 뷰 로직 간단하고 유지할 수 있습니다. 이 코드는 아마 상자의 밖으로 실행되지 않습니다, 그러나 희망 그것은 당신에게 몇 가지 아이디어를주고 질문을 해결하기 위해 올바른 방향을 제시해주기위한 것이다.

  3. ==============================

    3.레일이 작업을 수행 할 수있는 방법을 가지고있다 -이 도입되었을 때 나는 모르겠지만, 기본적으로 여기에 설명 된 것 : http://guides.rubyonrails.org/form_helpers.html#using-form-helpers

    레일이 작업을 수행 할 수있는 방법을 가지고있다 -이 도입되었을 때 나는 모르겠지만, 기본적으로 여기에 설명 된 것 : http://guides.rubyonrails.org/form_helpers.html#using-form-helpers

    그것은 부모 개체가 없습니다 경우 제대로 구성을 변경 하구의 비트를했다, 그러나 이것은 (이것은 기본적으로 gamov의 대답과 동일하지만 깨끗하고와 혼합 "새로운"기록을 허용하지 않는 올바른 것 같다 "업데이트"기록) :

    <%= form_tag photos_update_path do %>
      <% @photos.each do |photo| %> 
        <%= fields_for "photos[#{photo.id}]", photo do |pf| %>
          <%= pf.text_field :caption %>
            ... [other fields]
        <% end %>
      <% end %>
    <% end %>
    

    [: 사진] 컨트롤러에서는 PARAMS의 해시하게 될 겁니다, 키가 사진 ID를, 그리고 값은 속성 해시입니다.

  4. ==============================

    4.당신은 여러 개체를 표현하기 위해 "모델 이름 []"구문을 사용할 수 있습니다.

    당신은 여러 개체를 표현하기 위해 "모델 이름 []"구문을 사용할 수 있습니다.

    보기에서 사용하는 "사진 []"모델 이름.

    <% form_for "photo[]", :url => photos_update_path do |f| %>
      <% for @photo in @photos %>
        <%= render :partial => "photo_form", :locals => {f => f} %>
        <%= submit_tag "Save"%>
      <% end %>
    <% end %>
    

    이것은 당신이 설명처럼 입력 필드를 채 웁니다.

    컨트롤러에서는 대량 업데이트를 할 수 있습니다.

    def update
      Photo.update(params[:photo].keys, params[:photo].values)
      ...
    end 
    
  5. ==============================

    5.Turadg가 언급 한대로 글렌의 대답과 새로운 기존 레코드를 혼합하면 실제로, 랙 (3.0.5 레일)이 실패합니다. 수동 fields_for 작업을함으로써이 문제를 해결할 수 있습니다 :

    Turadg가 언급 한대로 글렌의 대답과 새로운 기존 레코드를 혼합하면 실제로, 랙 (3.0.5 레일)이 실패합니다. 수동 fields_for 작업을함으로써이 문제를 해결할 수 있습니다 :

    <%= form_tag photos_update_path do %>
      <% @photos.each_with_index do |photo,i| %> 
        <%= fields_for 'photos[#{i}]', photo do |pf| %>
           <%= pf.hidden_field :id %>
            ... [other photo fields]
      <% end %>
    <% end %>
    

    당신이 저를 요구하는 경우에이 꽤 추한이지만, 신규 및 기존 기록을 혼합하는 동안이 편집 여러 레코드를 찾을 수있는 유일한 방법입니다. 여기 트릭 대신 레코드의 배열을 갖는 중, PARAMS 해시 AND 기록 해시의 ID (I, 0,1,2 등으로 번호가 매겨진) 해시의 배열을 얻을 수 있다는 것이다. 레일 이에 따라 기존 레코드를 업데이트하고 새로 만들 것입니다.

    하나 더 참고 : 당신은 여전히 ​​별도로 컨트롤러에서 신규 및 기존 레코드를 처리 할 필요가 (체크 경우 : id.present)

  6. from https://stackoverflow.com/questions/972857/multiple-objects-in-a-rails-form by cc-by-sa and MIT license