【问题标题】:DRY Rails Forms - Form PartialsDRY Rails 表格 - 表格部分
【发布时间】:2014-07-12 15:28:23
【问题描述】:

我遇到了重复 Rails 表单代码的问题。当我将它们放在一个部分时,它们会抛出 NoMethodError,我无法弄清楚如何使它们变得更干燥。

admin/exam_centers/edit.html.erb =>

<%= simple_form_for(@exam_center, url: admin_exam_center_path(@exam_center)) do |f| %>
  <%= f.input :city_id, collection:City.all, label: 'Şehir Seçiniz', label_method: :name %>
  <%= f.input :address, label: 'Adres' %>
  <%= f.input :building, label: 'Bina' %>
  <%= f.button :submit, "Kaydet", :class => "btn btn-info" %>
<% end %>

注意:admin_exam_center_path(@exam_center)

admin/exam_centers/new.html.erb =>

<%= simple_form_for(@exam_center, url: admin_exam_centers_path(@exam_center)) do |f| %>
  <%= f.input :city_id, collection:City.all, label: 'Şehir Seçiniz', label_method: :name %>
  <%= f.input :address, label: 'Adres' %>
  <%= f.input :building, label: 'Bina' %>
  <%= f.button :submit, "Kaydet", :class => "btn btn-info" %>
<% end %>

注意:admin_exam_centers_path(@exam_center)

他们像这样完美地工作。但是当我将它们放在部分中时,如下所示,new.html.erb 页面抛出“未定义方法exam_centers_path”错误,而edit.html.erb 页面抛出“未定义方法exam_center_path”错误。我怎样才能使这些表格 DRYer?

_form.html.erb =>

<%= simple_form_for(@exam_center) do |f| %>
  <%= f.input :city_id, collection:City.all, label: 'Şehir Seçiniz', label_method: :name %>
  <%= f.input :address, label: 'Adres' %>
  <%= f.input :building, label: 'Bina' %>
  <%= f.button :submit, "Kaydet", :class => "btn btn-info" %>
<% end %>

edit.html.erb =>

<%= render 'admin/exam_centers/form' %>

new.html.erb =>

<%= render 'admin/exam_centers/form' %>

顺便说一下,路由文件 =>

  namespace :admin do
   resources :exam_centers, except: :show
   resources :exam_languages, except: :show
  end

【问题讨论】:

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


    【解决方案1】:

    看起来您只需要使用 polymorphic url 构建器来指定您的路线中的 :admin 部分。尝试像这样指定表单助手:

    <%= simple_form_for([:admin, @exam_center]) do |f| %>
    

    这将允许 Rails 在生成其余部分之前添加命名路由的 admin_ 部分。

    【讨论】:

      【解决方案2】:

      您只将公共部分放在部分中,因此您可以执行以下操作:

      new.html.erb

      <%= simple_form_for(@exam_center, url: admin_exam_centers_path(@exam_center)) do |f| %>
        <%= render partial: "form", locals: {:f => f} %>
      <% end %>
      

      edit.html.erb

      <%= simple_form_for(@exam_center, url: admin_exam_center_path(@exam_center)) do |f| %>
        <%= render partial: "form", locals: {f: "f"} %>
      <% end %>
      

      _form.html.erb

      <%= f.input :city_id, collection:City.all, label: 'Şehir Seçiniz', label_method: :name %>
      <%= f.input :address, label: 'Adres' %>
      <%= f.input :building, label: 'Bina' %>
      <%= f.button :submit, "Kaydet", :class => "btn btn-info" %>
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-06-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多