[英]Rails Nested Resources - create and edit 2 levels away with form_for in partial
真的讓我的腦筋on腫了。 我是Rails的新手,嘗試做一些我確定不太困難的事情。
我有一個模型“旅行”,其中有很多“天”,其中有很多“活動”
我在“旅行”的show.html.erb視圖中,在此視圖中,我正在渲染表單的部分內容,該表單應允許我創建一個與“日”相關聯的新“活動”或編輯現有的已經屬於“一天”的“活動”
如何在部分表單中傳遞給form_for,我要為其創建新的“活動”的局部變量“ Day”。 並使用部分相同的表單,我如何檢索與“活動”相關聯的“日期”? 最終,這些將是AJAX加載的對象。 我已經搜索了過去幾個小時,找不到類似的示例。 我非常感謝您的幫助。
routes.rb
resources :trips do
resources :days
end
resources :days do
resources :activities
end
行程的show.html.erb
<div id="activities_list">
<%= render :partial => "activities" %>
</div>
<div id="activity_form">
<%= render :partial => "/activities/form", :locals => { :activity => @activity} %>
</div>
<div id="bottom">
<%= link_to 'Edit', edit_trip_path(@trip) %> |
<%= link_to 'Back', trips_path %>
</div>
_activities.html.erb部分
<h1><%= @trip.title %></h1>
<% @trip.days.each do |day| %>
<div id="blech_<%= day.id %>">
<b><%= day.summary %></b>
<% day.activities.each do |activity| %>
<li id="activity_<%= activity.id %>"><%= link_to activity.address, edit_day_activity_path(day, activity), :remote => true %></li>
<% end %>
<% end %>
<%= link_to 'New Activity', new_day_activity_path(day), :remote => true %>
</div>
<% end %>
_form.html.erb部分我知道我需要使用(@ day,@ activity)變量來調用day_activity_path。 但我不知道如何在這里獲取@day變量
<%= form_for([@activity], :remote => true) do |f| %>
<fieldset>
<%= f.label :title, "Activity" %><br />
<%= f.text_field :title, :rows => 1 %><br />
</fieldset>
<div class="actions">
<%= f.submit %>
</div>
<% end %>
好的,假設您要添加一天的新活動。
不要忘記我們在這里使用REST(http://old.thoughtsincomputation.com/posts/understanding-rest-in-rails-3)
我們的一天必須進行很多活動,而我們的活動屬於一天
class Day < ActiveRecord::Base
has_many :activities
end
class Activity < ActiveRecord::Base
belongs_to :day
end
我們的路線應該像我
resources :days do
resources :activities
end
有了路線,我們擁有的生成路徑就像
days_path
day_path
new_day_path
new_day_activity_path
delete_day_activity_path
edit_day_activity_path
在我們的日視圖中,我們位於localhost:3000 / days / 1之類的網址(DaysController,動作顯示)
在這種情況下,我們可以添加@activity = Activity.new,並在下面的部分添加以下表格
<%= form_for [@day, @activity] do |form_field| %>
rest_code_goes_here
<% end %>
該表格將在ActivityController中的action:create with day提交,然后控制器將檢查驗證並保存。
看看鏈接是一個小應用程序,我已經使用過類似的東西https://github.com/leftis/tefteraki/blob/master/app/views/debts/_new_dose.haml
哦,這實際上意味着旅行有很多天,而資源有更多類似的嵌套
resources :trips
resources :days
resources :activities
end
end
因此,當您在local / trips / 1 /中時,您實際上在TripController中,請顯示動作,而無需創建一天,就無法做到這一點。您可以在當日擁有一個可將嵌套表單用於活動的表單。
最簡單的方法是ryan bates的瑰寶https://github.com/ryanb/nested_form,但要做到這一點,您必須先將關系從habtm更改為
class Day
has_many :activities
end
class Activity
belongs_to :day
end
然后您將在行程顯示視圖中添加一個日間表單
<% nested_form_for [:trip, Day.new], :remote => true do |form| %>
<%= form.text_field :date %>
<%= form.fields_for :activities do |activity_form| %>
<%= activity_form.text_field :name %>
<%= activity_form.link_to_remove "Remove this activity" %>
<% end %>
<p><%= form.link_to_add "Add an activity", :tasks %></p>
<% end %>
表單現在向DaysController.create發出了一個帶有行程和活動參數的請求,並要求將其送達
檢查gem和我的應用程序,我正在使用所有這些功能,希望對您有所幫助!!!
這就是我最終所做的,並且有效。
在我的show.html.erb中作為“旅行”。
show.html.erb
<div id="activity_form">
<h2>Activities</h2>
</div>
鏈接到“編輯”一個活動。注意:remote => true,它告訴Rails控制器這是一個AJAX請求,以便呈現edit.js.erb
<%= link_to activity.location[0, 20], edit_day_activity_path(day, activity), :class=>"btn btn-info fixedwidthbtn", method: :get, :remote => true
_form.html.erb此表單部分位於“活動視圖”目錄(../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)下的文件。 說要獲取ID為“ activity_form”的DOM元素並呈現部分“ form”
$("#activity_form").html("<%= escape_javascript(render(:partial => "form"))%>");
update.js.erb在“編輯”表單上單擊“更新”以呈現“活動列表”的更新部分后,我加入了此javascript。 這樣我就不必重新加載頁面即可查看更新。
$("#activities_list").html("<%= escape_javascript( render(:partial => "/trips/activities") ) %>");
route.rb這就是我嵌套路線的方式。 遵循最佳做法僅做1級。
資源:旅行做資源:天結束
資源:天做資源:活動結束
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.