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: role
Des 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!
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
@ 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
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