真的在这个问题上绞尽脑汁。我对Rails相对较新,并尝试做一些我确定不太难的事情。
我有一个模型“旅行”,它有许多“天”,有许多“活动”
我在“Trip”的show.html.erb视图中,在这个视图中,我正在渲染一个表格,它应该允许我创建一个与“Day”关联的新“Activity”或者编辑已属于“日”的现有“活动”
如何以局部形式传递给form_for,本地变量为“Day”我想为其创建新的“Activity”。并使用相同的形式部分,我如何检索“活动”与之关联的“日”?最终这些将是AJAX加载的对象。 我用谷歌搜索过去几个小时,找不到任何类似的例子。我非常感谢你的帮助。
的routes.rb
resources :trips do
resources :days
end
resources :days do
resources :activities
end
show.html.erb for Trip
<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 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 %>
_form.html.erb partial 我知道我需要使用(@ 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 %>
答案 0 :(得分:0)
好吧,假设您想要在一天内添加新活动。
不要忘记我们在这里使用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 the day 并且控制器将检查验证并保存。
看看链接是一个小应用程序,我已经使用过类似的东西 https://github.com/leftis/tefteraki/blob/master/app/views/debts/_new_dose.haml
答案 1 :(得分:0)
哦,实际意味着旅行有很多天,而且资源有更多的嵌套,比如
resources :trips
resources :days
resources :activities
end
end
所以当你在本地/旅行/ 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发出了一个带params的请求 和活动,并要求ajaxly服务
检查gem和我的应用程序我正在使用所有这些我希望它有帮助!!!
答案 2 :(得分:0)
这就是我最终做的事情并且有效。
在我的show.html.erb中为我的“旅行”。
<强> show.html.erb 强>
<div id="activity_form">
<h2>Activities</h2>
</div>
链接到“编辑”一个活动。请注意:remote =&gt; 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元素并呈现部分“表单”
$("#activity_form").html("<%= escape_javascript(render(:partial => "form"))%>");
update.js.erb 我在编辑表单上点击更新后包含此javascript,以呈现活动列表的更新部分。这样我就不必重新加载页面来查看更新。
$("#activities_list").html("<%= escape_javascript( render(:partial => "/trips/activities") ) %>");
routes.rb 这是我嵌套路线的方式。只按照最佳实践做到1级。
资源:旅行 资源:天 端资源:天做 资源:活动 结束