编辑特定对象

时间:2015-10-19 00:44:16

标签: ruby-on-rails

我有一个编辑视图。在这个视图中,我得到了一个下拉列表和一个部分渲染表单。像这样:

<ul class="dropdown-menu dropdown-user installations">
      <% @installations.each do |i| %>
         <li><a href="#">Installation<%= i.installation_id%></a></li>
       <% end %>
</ul>

<div class="ibox-content form-installations">                          
      <%= render :partial => 'installations/test'%>
      <%= render 'form_data' %>
</div>

编辑表单的视图:

  <%= simple_form_for @installation, class: 'form-horizontal' do |f| %>
        <%= f.error_notification %>
         ...
    <%end%>

控制器:

   def edit
        @installations = current_user.installations
        @installation = current_user.installations[0]
    end

所以在这一点上我可以在下拉列表中看到所有安装,但只能编辑第一个&#34; current_user.installations [0]&#34;。所以我的目标是在下拉菜单中选择安装并编辑选定的安装。我怎么能这样做?

1 个答案:

答案 0 :(得分:1)

最简单的方法是将相关的installation传递给下拉列表:

#app/controllers/installations_controller.rb
class InstallationsController < ApplicationController
   def index
      @installations = current_user.installations
   end
end

#app/views/installations/index.html.erb
<%= render @installations %>

#app/views/installations/_installation.html.erb
<%= simple_form_for installation do |f| %>
   ...
<% end %>

我认为您的代码结构存在一些重大问题 - 这就是您看到这些问题的原因。

<强> 1。修改

根据定义,编辑member路线......

enter image description here

这意味着Rails期望通过该路由加载单个资源(因此您将url.com/:id/edit作为路径)。

原因很简单--Rails / Ruby是object orientated。这意味着,每次create/read/update/destroy (CRUD),您都会将其添加到对象

使用@installation = Installation.new等来调用对象...这意味着如果你想编辑&#34;所有&#34;您的安装,您基本上需要为Installations资源使用其中一个集合路由,将任何字段发送到{{1}路径:

update

应该将更新发送到您应用的#app/views/installations/_installation.html.erb <%= simple_form_for installation, method: :patch do |f| %> ... <% end %> 路径,使其正常运行。

-

<强> 2。泛音

部分只是可以有多种用途的视图;你应该使用&#34;本地&#34;其中的变量。

有两种方法可以将局部范围变量调用为partials:

  • installations#update哈希
  • 中传递它们
  • locals: {}开关
  • 中传递它们

在这两种情况下,您都要设置&#34; local&#34;部分内部的变量具有仅在其外部可用的数据。

例如,您正在致电:

as: :__

... 里面部分。这很糟糕,因为您依赖 <%= simple_form_for @installation - 您最好使用@installation并在调用部分时填充它(正如我在上面的代码中所做的那样)。 / p>