设计不工作的茧嵌套形式

cocoon with devise not working Nested Form

我有一个新问题,尝试用 cocoon 实现设计,但它不保存在数据库中。请帮我 !!! :D

用户模型:

class User < ActiveRecord::Base
  has_many :telefonos
  accepts_nested_attributes_for :telefonos, :reject_if => :all_blank,  :allow_destroy => true

   devise :database_authenticatable, :registerable,
     :recoverable, :rememberable, :trackable, :validatable

电话机型号:

class Telefono < ActiveRecord::Base
  belongs_to :user
end

在我的用户控制器中:

def secure_params
    params.require(:user).permit(:telefonos_attributes: [:id, :telefono, :_destroy])
end

我的应用程序控制器

Class ApplicationController < ActionController::Base

  protect_from_forgery with: :exception

  before_filter :configure_permitted_parameters, if: :devise_controller?

    protected

        def configure_permitted_parameters
             devise_parameter_sanitizer.for(:sign_up) { |u| u.permit(:nombre, :email, :password) }
            devise_parameter_sanitizer.for(:account_update) { |u| u.permit(:email, :password, :current_password, :region_id, :ciudad_id, :nombre, telefonos_attributes: [:telefono, :user_id]) }
        end
     end

我的编辑视图:

<h3>Edit <%= resource_name.to_s.humanize %></h3>

  <%= simple_form_for resource, :as => resource_name, url: registration_path(resource_name), :html => { :method => :put} do |f| %>

    <div class="form-group">
      <%= f.input :nombre, :autofocus => true, class: 'form-control' %>
      <%= f.association :region, :include_blank => false %>
      <%= f.association :ciudad, :include_blank => false %>
    </div>
    <h1>Telefono</h1>
    <div id="telefonos">
    <%= f.simple_fields_for :telefonos do |t| %>
        <%= render 'telefono_fields', :f => telefono %>
    <% end %>
    <div class="links">
      <%= link_to_add_association 'add telefono', f, :telefonos %>
    </div>
  </div>
<%= f.submit 'Update' %>
<% end %>

我的_telefono_fields.html.erb

<div class="nested-fields">
  <%= f.input :telefono %>
  <%= link_to_remove_association "remove telefono", f %>

此致,

我用不同的方式做了同样的事情。我认为您得到 unpermitted parameters 是因为应用程序控制器方法不起作用。但我有一个解决方案给你。首先 运行 在您的终端中执行此命令:

rails g devise:controllers users

而不是users,您可以使用范围内的任何内容。这意味着它将生成这样的设计控制器 app/controllers/users/[all controllers]。然后在你的路由文件中这样做:

devise_for :users, controllers: {
    registrations: 'users/registrations'
  }

这将使用生成的 registrations_controller。现在在您生成的注册控制器中这样做。以下方法将写在注释中,只需取消注释并根据您的需要进行编辑:

class Users::RegistrationsController < Devise::RegistrationsController
  before_filter :configure_sign_up_params, only: [:create]
  before_filter :configure_account_update_params, only: [:update]

protected


  def configure_sign_up_params
    devise_parameter_sanitizer.for(:sign_up){ |u| u.permit(:email, :password, :password_confirmation, :nombre) }
  end

  def configure_account_update_params
    devise_parameter_sanitizer.for(:account_update){ |u| u.permit(:email, :password, :current_password, :password_confirmation, :region_id, :ciudad_id, :nombre, telefonos_attributes: [:id, :telefono, :user_id], :_destroy) }
  end

我假设您在注册时只需要提到的属性。如果您还需要任何其他属性,请添加它们。

默认情况下,该设备需要 current_password 才能进行任何编辑。如果您使用的是设计生成的视图,那么它应该包含 current_password 的字段。但是我在您的表格中的任何地方都看不到它。因此,如果你想跳过这个并且不希望用户每次都输入密码,那么在 registrations_controller 中仅在 protected 范围内添加:

def update_resource(resource, params)
  resource.update_without_password(params)
end

这对我有用。希望这对你也有帮助。