Je crée un petit projet pour mes étudiants et je suis confronté à un message d'erreur J'ai essayé toutes les solutions possibles mais je n'ai pas progressé.
Les images sont les différents modèles a et comment j'ai mis en place les associations respectives. Et aussi la méthode du contrôleur de Create et les paramètres autorisés.
Je peux clairement voir à partir de mes activités de serveur que toutes les valeurs d'attributs ont été capturées, mais je reçois une erreur indiquant "L'activité doit exister" .
Je serais heureux si quelqu'un aidez-moi.
Merci d'avance
Started POST "/user_activities" for 127.0.0.1 at 2019-01-16 21:15:48 +0100 Processing by UserActivitiesController#create as HTML Parameters: {"utf8"=>"â", "authenticity_token"=>"7v79xk6TW0IHNjkno+iXwzIYqqBjBMxCSodddPHUmKI/N4C9W6nkFz7qApXaQMEFJL6Qumn6BfsX/gxueMjp2w==", "user_activity"=>{"activity_id"=>"1", "user_activity_date"=>"2019-01-15", "user_activity_start"=>"20:14", "user_activity_end"=>"21:15", "user_activity_note"=>"testing to see if values can be retrieved"}, "commit"=>"Create User activity"} Activity ID -> 1 Date -> 2019-01-15 Start Time -> 20:14 End Time -> 21:15 Activity Note -> testing to see if values can be retrieved User Load (0.9ms) SELECT `users`.* FROM `users` WHERE `users`.`id` = 1 ORDER BY `users`.`id` ASC LIMIT 1 â³ app/controllers/user_activities_controller.rb:46 (0.5ms) BEGIN â³ app/controllers/user_activities_controller.rb:46 UserActivity Create (3.0ms) INSERT INTO `user_activities` (`created_at`, `updated_at`, `user_id`) VALUES ('2019-01-16 20:15:49', '2019-01-16 20:15:49', 1) â³ app/controllers/user_activities_controller.rb:46 (0.5ms) ROLLBACK â³ app/controllers/user_activities_controller.rb:46 Completed 500 Internal Server Error in 125ms (ActiveRecord: 12.4ms) ActiveRecord::NotNullViolation (Mysql2::Error: Field 'user_activity_date' doesn't have a default value: INSERT INTO `user_activities` (`created_at`, `updated_at`, `user_id`) VALUES ('2019-01-16 20:15:49', '2019-01-16 20:15:49', 1)): app/controllers/user_activities_controller.rb:46:in `create'
def user_activity_params params.require(:user_activity).permit(:activity_id, :user_activity_date, :user_activity_start, :user_activity_end, :user_activity_note) # params.fetch(:user_activity, {}).permit(:user_id, :activity_id, user_activity: [:user_activity_date, :user_activity_start, :user_activity_end, :user_activity_note]) # params.permit(:user_id, :activity_id, :user_activity_date, :user_activity_start, :user_activity_end, :user_activity_note) end
J'ai essayé la plupart de vos suggestions mais je n'ai toujours pas progressé, mais quand j'ai essayé ce qui suit, comme indiqué dans le code ci-dessous, j'obtiens un résultat étrange et pourtant je ne peux pas être inséré dans la base de données
def new @user_activity = UserActivity.new end def create # @user_activity = UserActivity.new(user_activity_params) activity_id = user_activity_params[:activity_id] #fetch this value from params as it comes puts "The activity ID which is received is -> #{activity_id.to_i}" # puts current_user.user_id user_activity_date = user_activity_params[:user_activity_date] puts "Date -> #{user_activity_date}" user_activity_start = user_activity_params[:user_activity_start] puts "Start Time -> #{user_activity_start}" user_activity_end = user_activity_params[:user_activity_end] puts "End Time -> #{user_activity_end}" user_activity_note = user_activity_params[:user_activity_note] puts "Activity Note -> #{user_activity_note}" @user_activity = current_user.user_activities.new(activity_id:activity_id.to_i, user_activity_date: user_activity_date.to_date,user_activity_start: user_activity_start.to_time,user_activity_end: user_activity_end.to_time, user_activity_note: user_activity_note ) end
Started POST "/user_activities" for 127.0.0.1 at 2019-01-16 06:45:44 +0100 Processing by UserActivitiesController#create as HTML Parameters: {"utf8"=>"â", "authenticity_token"=>"qfcYksfgoAzNaO4ZQ6rsG9WFV6waUywbsaOCTePsjpV4PmXp0tofWfS01as6ArrdwyNtthCt5aLs2tNXavD/7A==", "activity_id"=>"3", "user_activity"=>{"user_activity_date"=>"2018-12-31", "user_activity_start"=>"12:02", "user_activity_end"=>"22:02", "user_activity_note"=>"Record User Activity"}
<%= form_with(model: user_activity, local: true) do |frm| %> <div class="field"> <%#= frm.label :activity_id %><br /> <%= select_tag 'activity_id', options_for_select(Activity.all.collect{ |u| [u.activity_name, u.id] }) %> </div> <div class="field"> <%= frm.label(get_user_activity_date) %><br /> <%= frm.date_field :user_activity_date, autofocus: true%> </div> <div class="field"> <%= frm.label(get_user_activity_start_time) %><br /> <%= frm.time_field :user_activity_start, autofocus: true %> </div> <div class="field"> <%= frm.label(get_user_activity_end_time) %><br /> <%= frm.time_field :user_activity_end, autofocus: true, autocomplete: "age" %> </div> <div class="field"> <%= frm.label(get_user_activity_note) %><br /> <%= frm.text_area :user_activity_note, autofocus: true %> </div> <div class="actions"> <%= frm.submit %> </div> <% end %>
3 Réponses :
Vous pouvez essayer de fournir activity_id
à la nouvelle user_activity
@user_activity = current_user.user_activities.build(activity_id: params[:activity_id])
S'il vous plaît, que voulez-vous dire en fournissant activity_id à la nouvelle user_activity ? J'ai essayé votre solution mais j'obtiens toujours le message d'erreur " L'activité doit exister ".
@user_activity = current_user.user_activities.new(user_activity_params)
@Bijindra J'ai parcouru les résultats du test et j'ai une chose similaire à celle suggérée par @ andriy-baran , mais j'ai réalisé que l'ID d'activité sélectionné dans le formulaire n'est pas passé aux paramètres du contrôleur même si je peux le voir à partir de la console du serveur de rails
mettez à jour votre question avec le code de formulaire html et publiez les paramètres reçus des journaux du serveur @BismarkAttaFrimpong
@BismarkAttaFrimpong je peux voir activity_id passé dans les paramètres que vous avez partagés, utilisez-le dans .build (activity_id: params [: activity_id] comme suggéré
Je ne parviens toujours pas à transmettre les paramètres à user_activity_params dans le contrôleur. Ou je fais peut-être quelque chose de mal? C'est ainsi que ma nouvelle méthode s'appelle def new @user_activity = UserActivity.new #user_activity = current_user.user_activities.build (user_activity_params) fin Aidez-moi à vérifier entre les deux, lequel est approprié. Merci
activity_id = user_activity_params [: activity_id] @user_activity = current_user.user_activities.new (activity_id: activity_id) fonctionne mais continue de lancer l'erreur des autres paramètres étant vides
Selon la description mentionnée dans l'article et les images de journal associées publiées, il semble que le activity_id soit transmis au contrôleur mais dans le mauvais ordre comme déclaré dans les paramètres du contrôleur.
Modifiez le code comme ci-dessous
Pour HTML
def create @user_activity = current_user.user_activities.build(user_activity_params) end
Pour Controller
<div class="field"> <%#= frm.label :activity_id %><br /> <%= select_tag 'user_activity[activity_id]', options_for_select(Activity.all.collect{ |u| [u.activity_name, u.id] }) %> </div>
J'ai essayé votre solution et toujours, le contrôleur ne reçoit pas le paramètre via user_activity_params même si je peux les voir transmis dans le journal du serveur
Les user_actitvity_params et create method sont-ils dans le même contrôleur?
Oui. Ils sont tous dans le contrôleur UserActivity
comment passez-vous les attributs de données à user_activity, je vois construire sans aucun paramètre appelé. La méthode user_activity_params existe également dans user_activity_controller ?. Le code du modèle semble correct, tout en créant une user_activity dans le contrôleur, assurez-vous que l'ID d'activité et l'ID utilisateur existent.
Veuillez ne pas publier d'images , postez plutôt le texte formaté.
<% = select (user_activities, "activity_id", Activity.all.collect {| a | [a.activity_name, a.id ]}, {include_blank: 'none'})%>
@Bijendra s'il vous plaît les méthodes create et user_activity_params sont toutes à l'intérieur du contrôleur UserActivity. J'utilise le code HTML ci-dessus pour transmettre l'ID d'objet Activity (activity_id) au contrôleur.
@BismarkAttaFrimpong que vous transmettez activity_id au contrôleur, vous devez maintenant vous assurer que activity_id est passé à la base de données depuis le contrôleur. Cette partie de code est manquante. Ouvrez la console Rails et exécutez le code ci-dessous pour obtenir une certaine compréhension. 1> user = User.last 2> obj1 = user.user_activities.build 3> obj1.save quelle est l'erreur? Maintenant, essayez 4> obj2 = user.user_activities.build (activity_id: Activity.last.id) 5> obj2.save quel est le o / p ici? désolé pour le formatage.
@Bijendra J'ai mis à jour comme vous l'avez demandé. Merci