0
votes

L'objet ou l'attribut doit exister - Rails 5.2.2

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é.

 entrez la description de l'image ici

 entrez la description de l'image ici

 entrez la description de l'image ici a>

 entrez la description de l'image ici

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.

entrez la description de l'image ici 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

Mise à jour de la question

Le formulaire HTML

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'

Le journal du serveur

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

Je tente toujours de résoudre le problème

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

Paramètres

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"}

Serveur Journal

<%= 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 %>


6 commentaires

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é.


<% = frm.label: activity_id%>
<% = 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


3 Réponses :


0
votes

Vous pouvez essayer de fournir activity_id à la nouvelle user_activity

@user_activity = current_user.user_activities.build(activity_id: params[:activity_id])


1 commentaires

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 ".



0
votes
 @user_activity = current_user.user_activities.new(user_activity_params)

5 commentaires

@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



0
votes

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>


3 commentaires

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