2012-12-12 3 views
1

동일한 페이지에서 모델에 대한 추가 및 편집 양식을 갖고 싶습니다. 당신은 내가 보여주고 JS로이 개 형태를 숨기고있어이 스크린 샷에서 볼 수 있습니다레일에서 같은 페이지에 양식 추가 및 편집

편집 양식에서

Add and Edit Forms

는, 사용자는 항공기의 ID를 선택하고 그것을 몇 가지 아약스와 다른 데이터를 채 웁니다.

현재,이 같은 파셜에서 두 가지 형태를 렌더링 해요 :

<!-- Add Aircraft --> 
<div id="aircraftmodal-add-content"> 
    <%= render 'aircrafts/new' %> 
</div> 
<!-- Edit Aircraft --> 
<div id="aircraftmodal-edit-content"> 
    <%= render 'aircrafts/edit' %> 
</div> 

내 형태가 거의 동일한 내용을 렌더링, 내가 편집 다른 ID를 형성함으로써 주위 해킹 해요 :

<!-- Add Partial ---> 
<%= form_for @aircraft, validate: true, remote:true do |air| %> 

<!-- Edit Partial --> 
<%= form_for @aircraft, :html => { id:'edit_aircraft'}, validate: true, remote:true do |air| %> 

두 페이지를 같은 페이지에 함께 넣을 때 수정 사항을 처리하는 데 레일스 빌트인을 어떻게 사용할 수 있습니까? 편집 양식을 다른 동작으로 지정해야합니까, 아니면 일반적인 코드로 둘 다 처리 할 수 ​​있습니까?

def create 
    @aircraft = current_user.aircrafts.build(params[:aircraft]) 
    @aircraft.save 
end 

귀하의 안내를 환영합니다. :)

답변

4

DRY에 관해서는 현지인을 사용하는 것이 어떻습니까?

<div id="aircraftmodal-add-content"> 
    <%= render 'aircrafts/form', :dom_id => "new_aircraft" %> 
</div> 
<!-- Edit Aircraft --> 
<div id="aircraftmodal-edit-content"> 
    <%= render 'aircrafts/form', :dom_id => "edit_aircraft" %> 
</div> 

<!-- Form Partial --> 
<%= form_for @aircraft, :html => { id: dom_id }, validate: true, remote:true do |air| %> 
    <% if dom_id == "edit_aircraft" %> 
    <%= ... select aircraft id ... %> 
    <% elsif dom_id == "new_aircraft" %> 
    <%= ... input aircraft id ... %> 
    <% end %> 
etc... 
+0

그것은 좋은 제안입니다. 나는 그것을 좋아한다. 하지만 내 컨트롤러에서 내'create' 액션은 폼 제출이 * add * 또는 * edit *인지 여부를 어떻게 알 수 있을까요? –

+0

'@ aircraft'가 이미 생성 되었다면'save' 메소드를 호출 할 것입니다. – Hauleth

+0

첫 번째 경우와 같습니다. 우리는 민감한 것을 변경하지 않았습니다. 기본적으로 "form_for @aircraft"는 다음과 같이 말합니다 : if @ aircraft.new_record? 그런 다음 action =>에 제출하십시오. HTTP POST로 작성하십시오. 그렇지 않으면 @ aircraft.persisted일까요? action => : HTTP PUT으로 업데이트하십시오. –

1

새 등록하면 항공기 (새/액션을 만들 수) 알고 @aircraft.persisted?를 사용하거나 할 수 있습니다 이미 (편집/업데이트 작업을) 지속 않다면. , 레일은 이미 개의 다른 식별자 'new_aircraft'을 지정하고 X는 항공기 ID :

그리고 선택/input_text와를 변경할 수있다 'edit_aircraft_X'ID를 지정해야합니다 같은 양식을, 당신은 그나마 사용

당신은 사용할 수 있습니다 :

<% if @aircraft.persisted? %> 
    <%= select... %> 
<% else %> 
    <%= input... %> 
<% end %> 
+0

나는 ** 편집 ** 양식에서 항공기 ID를 선택하고 Ajax를 통해 속성을 검색하는 경우'@ aircraft.persisted? '가 어떻게 사실이 될지 이해할 수 없다고 생각합니다. Ajax 호출을하기 전에 양식이 이미 렌더링되었습니다. –

+0

이것을 사용하여 양식 ID를 지정할 수 있습니다. 답변을 업데이트했습니다. – daniloisr

+0

양식을 렌더링 할 때 partial은 이미 @aircraft가 유지되는지 여부를 알고 있으며 form helper는 form_for를 사용하여 적절한 URL과 METHOD를 작성합니다. –

관련 문제