Jquery Rails嵌套资源-创建和编辑2个级别,其中部分使用表单_

Jquery Rails嵌套资源-创建和编辑2个级别,其中部分使用表单_,jquery,ruby-on-rails,ruby,ajax,ruby-on-rails-3,Jquery,Ruby On Rails,Ruby,Ajax,Ruby On Rails 3,这件事让我绞尽脑汁。我对Rails比较陌生,尝试做一些我确信不会太难的事情 我有一个模型“旅行”,它有许多“天”,有许多“活动” 我在“Trip”的show.html.erb视图中,在此视图中,我正在为一个表单呈现一个部分,该表单应允许我创建一个新的“活动”以与“天”关联,或编辑一个已经属于“天”的现有“活动” 如何在表单partial中传递到表单_,我要为其创建新“活动”的局部变量“Day”。使用相同的表单partial,我如何检索与“活动”相关联的“天”?最终,这些将是AJAX加载的对象。

这件事让我绞尽脑汁。我对Rails比较陌生,尝试做一些我确信不会太难的事情

我有一个模型“旅行”,它有许多“天”,有许多“活动”

我在“Trip”的show.html.erb视图中,在此视图中,我正在为一个表单呈现一个部分,该表单应允许我创建一个新的“活动”以与“天”关联,或编辑一个已经属于“天”的现有“活动”

如何在表单partial中传递到表单_,我要为其创建新“活动”的局部变量“Day”。使用相同的表单partial,我如何检索与“活动”相关联的“天”?最终,这些将是AJAX加载的对象。 我在谷歌上搜索了几个小时,找不到类似的例子。我真的很感谢你的帮助

routes.rb

  resources :trips do
    resources :days    
  end

  resources :days do
    resources :activities
  end 
<div id="activity_form">
<h2>Activities</h2>
</div> 
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/form”,:locals=>{:activity=>@activity}%>
|
\u activities.html.erb partial

<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 %>

真实%>
正确%>
\u form.html.erb partial我知道我需要使用(@day,@activity)变量调用day\u activity\u路径。但我不知道如何在这里获取@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 %>
true)do | f |%>

1%>

好,假设您想在一天中添加一项新活动

不要忘记,我们在这里使用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
有了它,生成的路径就像

days_path
day_path
new_day_path

new_day_activity_path
delete_day_activity_path
edit_day_activity_path
resources :trips
  resources :days
    resources :activities
  end
end
在我们的day视图中,我们的url类似于localhost:3000/days/1 (DaysController,动作秀)

在这种情况下,我们可以添加@activity=activity.new 并在部分中添加以下表格

<%= form_for [@day, @activity] do |form_field| %>
  rest_code_goes_here
<% end %>

剩余代码在这里
此表单将在ActivityController中提交,操作:随天创建 控制器将检查验证并保存它

看看链接是一个小应用程序,我用过类似的东西

哦,这实际上意味着旅行有很多天,而且资源有更多的筑巢,比如

days_path
day_path
new_day_path

new_day_activity_path
delete_day_activity_path
edit_day_activity_path
resources :trips
  resources :days
    resources :activities
  end
end
因此,当您在local/trips/1/中时,实际上您在TripController中,请显示操作 如果不创建一个day Texhnical,则无法完成此操作。您可以为当天创建一个表单,在该表单中可以使用嵌套表单进行活动

最简单的方法是莱恩·贝茨的宝石 但要做到这一点,你必须首先将你的关系从habtm改为

class Day
  has_many :activities
end

class Activity
  belongs_to :day
end
然后,您将在trip show视图中添加一个day表单

<% 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 %>
true do | form |%>

表单现在向DaysController.create发出请求,其中包含行程的参数 以及活动和要求提供的服务


查看gem和我的应用程序我正在使用所有这些我希望它能有所帮助

这就是我最后要做的事情,它起作用了

在我的show.html.erb中为我的“旅行”

show.html.erb

  resources :trips do
    resources :days    
  end

  resources :days do
    resources :activities
  end 
<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 
“btn btn信息固定宽度btn”,方法::get,:remote=>true
\u form.html.erb此表单部分位于活动视图目录(../views/Activities/\u form.html.erb)下

true)do | f |%>
1 %> 
edit.js.erb这是活动视图目录(../views/Activities/edit.js.erb)下的一个文件。表示获取ID为“activity\u form”的DOM元素并呈现部分“form”

$(“#活动形式”).html(“形式”)%>”;
update.js.erb我在编辑表单上点击update之后加入了这个javascript,以呈现活动列表的更新部分。这样我就不必重新加载页面来查看更新

$("#activities_list").html("<%= escape_javascript( render(:partial => "/trips/activities") ) %>");
$(“#活动列表”).html(“/trips/activities”))%>”;
routes.rb这是我嵌套路由的方式。按照最佳实践只执行1级

资源:旅行可以吗 资源:天 结束

资源:天做什么 资源:活动
结束

谢谢,但我实际上是从课堂旅行秀视图开始的(localhost:3000/trips/1/),我想下去创建(或更新)一个活动(属于旅行的一天)。当我们处于“旅行”级别时,我如何传递“@Day”?我想点击一个链接,上面写着“为第5天添加活动”和“@Day”“Day#5,@activity=activity.new.是吗?但是如何呢?而且,它必须由AJAXI传递到分部中?假设这可以工作,但不希望使用gem。嵌套模型表单的更新Railscast是否适用于此处?我是否可以只更新Days模型以使用“accepts_nested_attributes_for:activities”.在本例中,跳闸“显示”的控制器动作是什么样子的?