【问题标题】:How to render a "Edit" form partial in the "Show" page of another model in Rails如何在 Rails 中另一个模型的“显示”页面中部分呈现“编辑”表单
【发布时间】:2012-11-05 20:44:13
【问题描述】:

我想在父对象的“显示”视图中显示“编辑”表单。

我的模型如下所示: 一次旅行有很多天,其中有很多活动。 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 %>

【问题讨论】:

标签: ruby-on-rails ruby-on-rails-3


【解决方案1】:

这就是我最终做的事情,并且有效。

在我的“Trip”的 show.html.erb 中。

show.html.erb

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

链接到“编辑”一个 Activity。注意 :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 元素并渲染部分“表单”

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

update.js.erb 在编辑表单上点击更新后,我包含了这个 javascript,以呈现活动列表的更新部分。这样我就不必重新加载页面来查看更新。

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

routes.rb 这就是我嵌套路由的方式。仅按照最佳实践进行 1 级。

resources :trips do 
  resources :days 
end

resources :days do 
  resources :activities 
end

【讨论】:

  • 我处理了很多 ajax crud。你的回答解决了我2个问题。使用 ajax 渲染表单,并为嵌套模型渲染表单。非常感谢。
猜你喜欢
  • 2011-09-27
  • 1970-01-01
  • 2014-04-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-20
相关资源
最近更新 更多