2017-04-02 3 views
0

Désolé, je l'ai regardé des questions similaires à cela, mais ne peut toujours pas comprendre pour une raison quelconque ...Rails 5 SimpleForm pas mettre à jour les attributs imbriqués

J'utilise et je Concevoir essayer de mettre à jour mon modèle d'utilisateur et un modèle de ville en même temps (à travers la page d'enregistrement des modifications) en utilisant un formulaire imbriqué.

Je mets à jour la ville des utilisateurs en fonction d'un ensemble de valeurs prédéfinies qui se trouvent dans la base de données. Tout ce que l'utilisateur a à faire est de sélectionner une ville dans laquelle il vit à partir d'une liste, puis de l'enregistrer.

Tout ce qui se passe en ce moment est le formulaire soumis mais la ville n'est pas modifiée.

Merci d'avance!

#user.rb 
class User < ApplicationRecord 
    belongs_to :city 
end 

#city.rb 
class City < ApplicationRecord 
    has_many :users 
end 

Mon contrôleur:

class UsersController < ApplicationController 
    def index 
    @users = User.all 
    end 

    def edit 
    @user = User.find(params[:id]) 
    end 

    def update 
    @user = User.find(params[:id]) 

    if @user.update(user_params) 
     redirect_to @user 
    else 
     render 'edit' 
    end 
    end 

    def show 
    @user = User.find(params[:id]) 
    end 

    private 

    def user_params 
    params.require(:user).permit(city_attributes: [:id, :name, :user_id]) 
    end 
end 

Et ma forme:

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

     <%= f.simple_fields_for :city do |c| %> 

     <%= c.input :city_id, collection: City.all.order(name: :asc), label_method: :name, value_method: :id, label: "City", include_blank: false, selected: @user.city_id %> 

     <% end %> 
<% end %> 
+0

Je suppose que cela ne fonctionne pas car le formulaire ne renvoie pas à votre users_controller. Vous devez remplacer le fichier 'routes.rb' d'une manière spécifique pour indiquer à Devise d'utiliser votre contrôleur. – Iceman

+1

Merci @Iceman. J'ai posté ma réponse ci-dessous maintenant et mon problème est trié. Les attributs imbriqués ne fonctionnent toujours pas mais c'est quelque chose que je reviendrai à un autre moment. –

+0

Je suis content que vous ayez réussi, peut-être que je me pencherai sur l'autre problème un jour. – Iceman

Répondre

2

Ok donc je triai mon problème en se basant sur le commentaire de Iceman et réponse de ajerfer fils.

(Cependant, la question que le travail ne marche pas emboîtées reste, mais mon problème est résolu)

Comme Iceman dit a été le permet à ses Devise propres paramètres dans mon contrôleur d'application. J'ai donc déplacé les paramètres là (au lieu de changer mes routes). J'ai essayé à nouveau, mais les mêmes problèmes se produisaient. Donc, ce que je faisais était en fait la ferraille sous forme imbriquée et simplement changer mon contrôleur d'application à cela et ciblant la clé étrangère CITY_ID:

def configure_permitted_parameters 
    devise_parameter_sanitizer.permit(:sign_up, keys: [:first_name, :last_name]) 
    devise_parameter_sanitizer.permit(:account_update, keys: [:first_name, :last_name, :date_of_birth, :gender, :city_id]) 
    end 

Ma forme:

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

    <%= f.input :city_id, collection: City.all.order(name: :asc), label: "City" %> 

<%= f.button :submit, "Save" %> 
<% end %> 

et maintenant il fonctionne parfaitement bien!

-1

Essayez ceci:

def user_params 
    params.require(:user).permit(:city_id) 
end