8

親オブジェクトの「表示」ビューに「編集」フォームを表示したい。

私のモデルは次のようになります。旅行には多くの日があり、多くのアクティビティがあります。Tripは、Daysのネストされた属性を受け入れます。Daysは、アクティビティのネストされた属性を受け入れます。

旅行の「表示」ビューにいるときに、「アクティビティ」の「編集」フォームを部分的にレンダリングするにはどうすればよいですか?

編集するアクティビティIDを編集フォームに部分的に指定する必要があることはわかっていますが、「トリップ」の「表示」ビューからその情報を渡す方法がわかりません。

    <% @trip.days.each do |day| %>
    <div id="daydiv_<%= day.id %>">
      <b><%= day.summary %></b>
        <%= content_tag_for :ol, day do %>
          <% day.activities.each do |activity| %>
                <li id="activity_<%= activity.id %>"><%= link_to activity.address, edit_activity_path(activity) %></li>
          <% end %>
      <% end %>
    </div>
    <% end %>

<div id="activity_form">
  <%= render :partial => "/activities/form", :activity => @activity  %>
</div> 

私の/activities/ form部分は次のようになります:

<%= form_for(@activity) do |f| %>
  <div class="field">
    <%= f.label :title %><br />
    <%= f.text_field :title %>
  </div>

  <div class="actions">
    <%= f.submit %>
  </div>
<% end %>
4

1 に答える 1

6

これは私がやったことであり、それは機能します。

私の「Trip」のshow.html.erb。

show.html.erb

<div id="activity_form">
<h2>Activities</h2>
</div> 

アクティビティを「編集」するためのリンク。:remote => trueに注意してください。これは、edit.js.erbをレンダリングするためにこれがAJAXリクエストになることをRailsコントローラーに通知します。

<%= link_to activity.location[0, 20], edit_day_activity_path(day, activity), :class=>"btn btn-info fixedwidthbtn", method: :get, :remote => true 

_form.html.erbこのフォームの一部は、Activities Viewディレクトリ(../views/activities/_form.html.erb)の下にあります。

<%= form_for([@day, @activity], :remote => true) do |f| %>
<fieldset>
  <%= f.label :title, "Activity" %>
  <%= f.text_field :title, :rows => 1 %> 
</fieldset>
  <div class="actions">
    <%= f.submit %>
  </div>
</form>
   <%= link_to 'Delete', [@day, @activity], method: :delete, data: { confirm: 'Are you sure?' } %>
<% end %>

edit.js.erbこれは、アクティビティビューディレクトリ(../views/activities/edit.js.erb)の下にあるファイルです。「activity_form」のIDを持つDOM要素を取得し、部分的な「フォーム」をレンダリングすると言います

$("#activity_form").html("<%= escape_javascript(render(:partial => "form"))%>");

update.js.erb [編集]フォームで[更新]をクリックして、アクティビティリストの更新された部分をレンダリングした後、このJavaScriptを含めました。更新を表示するためにページをリロードする必要がないようにします。

$("#activities_list").html("<%= escape_javascript( render(:partial => "/trips/activities") ) %>");

ルート.rbこれは私が自分のルートをネストする方法です。ベストプラクティスに従って1レベルのみ実行します。

resources :trips do 
  resources :days 
end

resources :days do 
  resources :activities 
end
于 2012-11-10T21:53:13.613 に答える