2016-10-17 1 views
0

Je suis coincé avec un genre de chose simple où j'ai essayé beaucoup de choses qui ne fonctionnent pas. Voici ce que j'ai. Dans mon application, current_user doit mettre à jour les rôles pour les utilisateurs appartenant à des sociétés current_user. Je peux obtenir à l'action d'édition, où les choix appropriés pour le rôle d'utilisateur particulier est montré, cependant je ne peux pas faire l'action de mise à jour - il reste toujours dans l'action d'édition.Rails 5: coincé dans l'action d'édition, mise à jour ne fonctionne pas

C'est ce que j'ai dans /models/role.rb:

class Role < ApplicationRecord 
belongs_to :user, optional: true, inverse_of: :roles 
accepts_nested_attributes_for :user 

enum general: { seller: 1, buyer: 2, seller_buyer: 3}, _suffix: true 
enum dashboard: { denied: 0, viewer: 1, editer: 2, creater: 3, deleter: 4}, _suffix: true 
# other columns for roles follow # 

/models/user.rb ressemble à ceci:

#User has roles 
    has_many :roles 
    has_many :company_user_roles, through: :companies, source: :user_roles 
    accepts_nested_attributes_for :roles, reject_if: proc { |attributes| attributes[:name].blank? } 

# User has many companies 
    has_many :accounts, dependent: :destroy 
    has_many :companies, through: :accounts 

En /contrôleurs/common/roles_controller.rb J'ai ceci:

class Common::RolesController < ApplicationController 

def edit 
@role = Role.find(params[:id]) 
end 

def update 
@role = Role.find(params[:id]) 
if @role.update_attributes(role_params) 
    flash[:success] = "Role updated!" 
    redirect_to dashboard_path 
else 
    render 'edit' 
end 

private 

def role_params #at the end ID of user to whom belongs role is stored 
    params.require(:role).permit(:general, :dashboard, //..other role table columns..// , :user_id) 
end 

En /views/common/roles/edit.html.erb J'ai ceci:

<%= form_for ([:common, @role]) do |f| %> 
    <%= f.select :general, Role.generals.map { |key, value| [key.humanize, key] } %> 
    <%= f.select :dashboard, Role.dashboards.map { |key, value| [key.humanize, key] } %> 
    <%= f.submit "Save changes" %> 
<% end %> 

Quand j'ouvre /common/rôles/1/modifier Je vois ceci:

Started GET "/common/roles/1/edit" for 194.8.16.19 at 2016-10-17 13:08:17 +0000 
Processing by Common::RolesController#edit as HTML 
Parameters: {"id"=>"1"} 
User Load (0.2ms) SELECT "users".* FROM "users" WHERE "users"."id" = ? LIMIT ? [["id", 1], ["LIMIT", 1]] 
Role Load (0.5ms) SELECT "roles".* FROM "roles" WHERE "roles"."id" = ? LIMIT ? [["id", 1], ["LIMIT", 1]] 

Lorsque je presse sur "Enregistrer" bouton, je vois ceci:

Started GET "/common/roles/1/edit?utf8=%E2%9C%93&_method=patch&authenticity_token=QoCCvXkM2%2B77ZyO0npTBKv1PKTQdkFjkLLbIgmdSXN8uli1ElLBfwHD6GXVTA%2Fa65cQPVPCqJNSkF0d8l5SSgw%3D%3D&general=seller_buyer&dashboard=editer&rights=editer&commit=Save+changes" for 194.8.16.19 at 2016-10-17 13:10:54 +0000 
Processing by Common::RolesController#edit as HTML 
Parameters: {"utf8"=>"✓", "authenticity_token"=>"QoCCvXkM2+77ZyO0npTBKv1PKTQdkFjkLLbIgmdSXN8uli1ElLBfwHD6GXVTA/a65cQPVPCqJNSkF0d8l5SSgw==", "general"=>"seller_buyer", "dashboard"=>"editer", "rights"=>"editer", "commit"=>"Save changes", "id"=>"1"} 
User Load (0.5ms) SELECT "users".* FROM "users" WHERE "users"."id" = ? LIMIT ? [["id", 1], ["LIMIT", 1]] 
Role Load (0.4ms) SELECT "roles".* FROM "roles" WHERE "roles"."id" = ? LIMIT ? [["id", 1], ["LIMIT", 1]] 

ou comme celui-ci:

--- !ruby/object:ActionController::Parameters 
parameters: !ruby/hash:ActiveSupport::HashWithIndifferentAccess 
    utf8: "✓" 
    _method: patch 
    authenticity_token: QoCCvXkM2+77ZyO0npTBKv1PKTQdkFjkLLbIgmdSXN8uli1ElLBfwHD6GXVTA/a65cQPVPCqJNSkF0d8l5SSgw== 
    general: seller_buyer 
    dashboard: editer 
    rights: editer 
    commit: Save changes 
    controller: common/roles 
    action: edit 
    id: '1' 
permitted: false 

On dirait qu'il ne passe pas « rôle » => {... et après jeton, il montre params que j'essaie de mettre à jour. Si je comprends bien cela pourrait être, pourquoi la mise à jour ne se produit pas.

rôle routes.rb ressembler à ceci:

namespace :common do 
    resources :companies 
    resources :roles 
end 

Index et de l'action Modifier des rôles de travail, toutes les actions, y compris mise à jour, le travail pour les entreprises.

Je suis un peu désespéré concernant cette erreur, car j'ai essayé beaucoup de choses, mais rien ne fonctionne. Comment puis-je résoudre ce problème pour que l'action de mise à jour fonctionne, s'il vous plaît? Nous vous remercions de votre aide pour les erreurs potentielles.

Mise à jour Je peux mettre à jour les rôles manuellement dans la console sans problème - trouver le rôle par ID et mettre à jour n'importe quelle colonne. Toujours pas de chance dans la forme - reste dans l'action Modifier après f.submit.

Mise à jour 2

On dirait que tout avec les routes sont bonnes:

     common_roles GET /common/roles(.:format)       common/roles#index 
            POST /common/roles(.:format)       common/roles#create 
        new_common_role GET /common/roles/new(.:format)      common/roles#new 
       edit_common_role GET /common/roles/:id/edit(.:format)     common/roles#edit 
         common_role GET /common/roles/:id(.:format)      common/roles#show 
            PATCH /common/roles/:id(.:format)      common/roles#update 
            PUT /common/roles/:id(.:format)      common/roles#update 
            DELETE /common/roles/:id(.:format)      common/roles#destroy 

Jusqu'à présent, aucune idée pourquoi l'erreur se produit toujours ... que je comprends ce n'est pas à cause des routes mal.

Mise à jour 3

Ok, j'ai compris, pourquoi l'action Edit bloqué - parce que je pensais qu'il n'a pas d'importance si form_for est avant ou après <form class> balise. Il semble être que je devais le mettre avant l'étiquette <form class>. Donc non maintenant je reçois l'erreur principale sur screent: param is missing or the value is empty: roleDes idées pourquoi?

Mise à jour 4

Ok, donc maintenant j'ai trouvé le principal problème. Fondamentalement, les Enums ne sont pas mis à jour du tout. Puisque mon formulaire se compose uniquement d'Enums, il n'est pas transmis et n'est pas mis à jour. Maintenant, je dois savoir, comment je dois enregistrer/mettre à jour les Enums correctement. Tout indice est le bienvenu!

+0

La question est la méthode: 'form_for' devrait générer une forme avec une méthode POST (vous devriez voir « Démarrage POST sur [...] » lorsque vous cliquez sur « Enregistrer les modifications ») – user3033467

+0

@ user3033467 Oui, je sais, cependant j'ai la forme identique pour "Entreprises" (par exemple/common/companies/1/edit) et là je peux faire la mise à jour sans aucun problème. Cela me déroute beaucoup. Comment puis-je me rendre au POST, s'il vous plaît? – matiss

+0

Vous ne devez pas utiliser d'espaces entre les noms de vos méthodes et leurs parenthèses ouvrantes. 'form_for (' devrait être 'form_for ('. – meagar

Répondre

0

form_for ([:common, @role], :html => { method: 'POST' }) devrait fonctionner

+0

Il m'a donné cette erreur: 'erreur de syntaxe , keyword_ensure inattendu, j'attend la fin de l'entrée »bien que j'ai mis' <% end %> 'à la fin de mon formulaire – matiss

+0

ok, je l'ai mis sans espace après' form_for – matiss

+0

mais pas de changement - toujours coincé dans l'action d'édition – matiss