[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.레일 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.레일이 작업을 수행하려면 많은 당신을 도움이 될 수 없습니다. 당신이보기 컨트롤러, 심지어 루트에서 해결을해야 할 것이다, 그래서 그것은 표준보기 규칙에 간다. 그건 재미 없다.
레일이 작업을 수행하려면 많은 당신을 도움이 될 수 없습니다. 당신이보기 컨트롤러, 심지어 루트에서 해결을해야 할 것이다, 그래서 그것은 표준보기 규칙에 간다. 그건 재미 없다.
다중 모델 형태의 레일 방식으로 거래의 주요 자원은 스티븐 추의 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.레일이 작업을 수행 할 수있는 방법을 가지고있다 -이 도입되었을 때 나는 모르겠지만, 기본적으로 여기에 설명 된 것 : 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.당신은 여러 개체를 표현하기 위해 "모델 이름 []"구문을 사용할 수 있습니다.
당신은 여러 개체를 표현하기 위해 "모델 이름 []"구문을 사용할 수 있습니다.
보기에서 사용하는 "사진 []"모델 이름.
<% 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.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)
from https://stackoverflow.com/questions/972857/multiple-objects-in-a-rails-form by cc-by-sa and MIT license
'RUBY-ON-RAILS' 카테고리의 다른 글
[RUBY-ON-RAILS] 부하에 해당 파일 - 루비 젬 (LoadError) (0) | 2020.02.04 |
---|---|
[RUBY-ON-RAILS] D3 자바 스크립트에서 원 객체 내에 이미지를 추가? (0) | 2020.02.04 |
[RUBY-ON-RAILS] 레일 redirect_to의 매개 변수 전달 (0) | 2020.02.04 |
[RUBY-ON-RAILS] 어떻게 레일에 to_json 오버라이드 (override)? (0) | 2020.02.04 |
[RUBY-ON-RAILS] 3 레일 - PG 보석을 설치할 수 없습니다 (0) | 2020.02.04 |