Должен существовать объект или атрибут - Rails 5.2.2 - PullRequest
0 голосов
/ 15 января 2019

Я создаю небольшой проект для своих учеников, и у меня появляется сообщение об ошибке. Я перепробовал все возможные решения, но ничего не сделал.

enter image description here

enter image description here

enter image description here

enter image description here

enter image description here

Изображения - это различные модели и то, как я реализовал соответствующие ассоциации. А также метод контроллера Create и разрешенные параметры.

enter image description here Из действий сервера я ясно вижу, что все значения атрибутов были зафиксированы, но вы получаете сообщение об ошибке, которое говорит «Активность должна существовать» .

Я был бы рад, если бы кто-нибудь мне помог.

Заранее спасибо

Обновление вопроса

Форма HTML

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

Журнал сервера

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

Все еще пытаюсь решить проблему

Я испробовал большинство ваших предложений, но все еще безрезультатно, но когда я попробовал следующее, как указано в приведенном ниже коде, я получил странный результат и все же не может быть вставлен в базу данных

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

Параметры

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

Журнал сервера

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'

Ответы [ 3 ]

0 голосов
/ 16 января 2019
#user.rb

class User < ApplicationRecord
  has_many :user_activities
  has_many :activities, through: :user_activities
end

#activity.rb

class Activity < ApplicationRecord
  has_many :user_activities
  has_many :users, through: :user_activities
end

#user_activity.rb

class UserActivity < ApplicationRecord
  belongs_to :user
  belongs_to :activity
end

Я скопировал ваши модели в небольшое приложение и попробовал выполнить операции с консоли Rails. Это должно дать вам лучшее понимание

Loading development environment (Rails 5.2.2)
2.4.1 :002 > Activity.last
   (0.3ms)  SET NAMES utf8,  @@SESSION.sql_mode = CONCAT(CONCAT(@@sql_mode, ',STRICT_ALL_TABLES'), ',NO_AUTO_VALUE_ON_ZERO'),  @@SESSION.sql_auto_is_null = 0, @@SESSION.wait_timeout = 2147483
  Activity Load (0.2ms)  SELECT  `activities`.* FROM `activities` ORDER BY `activities`.`id` DESC LIMIT 1
 => nil 
2.4.1 :004 > obj = Activity.new(name: "Cricket", activity_type: "Sports")
 => #<Activity id: nil, name: "Cricket", created_at: nil, updated_at: nil, activity_type: "Sports"> 
2.4.1 :005 > obj.save
   (0.2ms)  BEGIN
  Activity Create (0.4ms)  INSERT INTO `activities` (`name`, `created_at`, `updated_at`, `activity_type`) VALUES ('Cricket', '2019-01-16 05:20:10', '2019-01-16 05:20:10', 'Sports')
   (6.4ms)  COMMIT
 => true 
2.4.1 :007 > obj1 = User.new(name: "user1",city: "city1") 
 => #<User id: nil, name: "user1", role_id: nil, created_at: nil, updated_at: nil, city: "city1"> 
2.4.1 :008 > obj1.save
   (0.2ms)  BEGIN
  User Create (0.4ms)  INSERT INTO `users` (`name`, `created_at`, `updated_at`, `city`) VALUES ('user1', '2019-01-16 05:20:59', '2019-01-16 05:20:59', 'city1')
   (5.9ms)  COMMIT
 => true

Итак, я создал некоторые фоновые данные перед следующими операциями,

2.4.1 :001 > user = User.last
(0.3ms)  SET NAMES utf8,  @@SESSION.sql_mode = CONCAT(CONCAT(@@sql_mode, ',STRICT_ALL_TABLES'), ',NO_AUTO_VALUE_ON_ZERO'),  @@SESSION.sql_auto_is_null = 0, @@SESSION.wait_timeout = 2147483
    User Load (0.3ms)  SELECT  `users`.* FROM `users` ORDER BY `users`.`id` DESC LIMIT 1
   => #<User id: 1, name: "user1", role_id: nil, created_at: "2019-01-16 05:20:59", updated_at: "2019-01-16 05:20:59", city: "city1"> 
  2.4.1 :002 > obj1 = user.user_activities.build
   => #<UserActivity id: nil, user_id: "1", activity_id: nil, created_at: nil, updated_at: nil> 
  2.4.1 :003 > obj1.save
     (0.3ms)  BEGIN
     (0.2ms)  ROLLBACK
   => false 
  2.4.1 :004 > obj1.errors.full_messages
   => ["Activity must exist"] 
  2.4.1 :005 > obj1 = user.user_activities.build(activity_id: Activity.last.id)
    Activity Load (0.3ms)  SELECT  `activities`.* FROM `activities` ORDER BY `activities`.`id` DESC LIMIT 1
   => #<UserActivity id: nil, user_id: "1", activity_id: "1", created_at: nil, updated_at: nil> 
  2.4.1 :006 > obj1.save
     (0.2ms)  BEGIN
    Activity Load (0.3ms)  SELECT  `activities`.* FROM `activities` WHERE `activities`.`id` = 1 LIMIT 1
    UserActivity Create (0.2ms)  INSERT INTO `user_activities` (`user_id`, `activity_id`, `created_at`, `updated_at`) VALUES ('1', '1', '2019-01-16 05:23:32', '2019-01-16 05:23:32')
     (5.6ms)  COMMIT
   => true 

["Активность должна существовать"], найдите эту ошибку в консоли, и причина в том, что код_действия не был передан объекту user_activity. Теперь обновите ваш код в контроллере

activity_id = #fetch this value from params as it comes
@user_activity = current_user.user_activities.new(activity_id: activity_id)

Я вижу, что у вас есть метод user_activity_params с несколькими атрибутами, как только приведенный выше код работает, проверьте его с новой строкой, если требуется.

 @user_activity = current_user.user_activities.new(user_activity_params)
0 голосов
/ 16 января 2019

В соответствии с описанием, упомянутым в посте, и соответствующими изображениями журнала, похоже, что activity_id передается контроллеру, но в неправильной последовательности, как объявлено в параметрах контроллера.

Измените код, как показано ниже

Для HTML

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

Для контроллера

def create
    @user_activity = current_user.user_activities.build(user_activity_params)
end

Теперь Activity_id будет передан в user_activity и, следовательно, параметры будут проанализированы, как указано в методе activity_params.

0 голосов
/ 15 января 2019

Вы можете попытаться предоставить activity_id новому user_activity

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