2016-11-22 1 views
1

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

Домашнее задание хранится в основном в домашней таблице, но homework_student держит completed_on и булево полный атрибут:

homework_student.rb

id    :integer   not null, primary key 
    # school_user_id :integer   not null 
    # homework_id :integer   not null 
    # completed_on :datetime 
    # created_at  :datetime   not null 
    # updated_at  :datetime   not null 
    # complete  :boolean 

belongs_to :homework, :class_name => 'Homework', :foreign_key => :homework_id, dependent: :destroy 

homework.rb

has_many :homework_students, :class_name => 'HomeworkStudent', dependent: :destroy 

Моя попытка .. .

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

Маршруты:

resources :homeworks do 
    resources :homework_students do 
    member do 
     patch :complete 
    end 
    end 
end 

homeworks_controller.rb:

def complete 
     @complete_item = Homework.homework_students.update_attribute(:completed_on, Time.now) 
    end 

На мой взгляд:

<% @homework.homework_students.each do |homework_student| %> 
      <%= link_to "complete", complete_homework_path(:homework_id => @homework, :home_work_students_id => homework_student), method: :patch %> 
      <% end %> 

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

Ошибка:

undefined local variable or method `homework 

Ценит какие-либо указания.

UPDATE: homeworks_controller.rb

 before_action :find_homework, only: [:show, :complete, :edit, :update] 
        #before_action :set_homework, only: [:show] 
        #before_action :set_homework_student, except: [:create] 
        before_action :authenticate_user! 

      .... 
    def complete 
     # Loop over each matching homework_student for the @homework where the id matches and update the completed_on attribute. 
     # You need to get the indivual homework_student record and update it. You could do it other ways but this seemed to work for me. 
     @homework.homework_students.where(id: params[:home_work_students_id]).each do |homework_student| homework_students.update_attributes(:completed_on => Time.now) 
     end 
     # Redirect back to the @homework view. 
     redirect_to @homework, notice: 'Homework was successfully marked as complete.'   
     end 
      .... 

      private 

       def set_homework_student 
        @homework_students = HomeworkStudent.find(params[:homework_id]) 
       end 

       def set_homework 
        @homework = @homework_students.homeworks.find(params[:id]) 
       end 


       def homework_params 
        params.require(:homework).permit(:user_id, :id, :school_user_id, :homeworks, :significance, :significance_id, :sig_option, :feedback_request, :subject, :source, :description, :due, :completed_at, homework_students: [:completed_on, :complete], school_user: [:f_name, :s_name]) 
       end 



def find_homework 
      @homework = Homework.find(params[:id]) 
     end 
end 

ОБНОВЛЕНО ОШИБКА:

Error message: 

undefined method `update_attributes' for nil:NilClass 

Rails.root: 

Application Trace | Framework Trace | Full Trace 
app/controllers/homeworks_controller.rb:39:in `block in complete' 
app/controllers/homeworks_controller.rb:39:in `complete' 
Request 

Parameters: 

{"_method"=>"patch", 
"authenticity_token"=>"OL1vW0BnnJ8TM5lshZWNKisNMrTU2Gp2cY7jYf3T+NRhlx2994q0ndrpehz+vW5unY1EBtSKCHecOJjTDwLHsw==", 
"home_work_students_id"=>"142", 
"homework_id"=>"78", 
"id"=>"78"} 

VIEW Обновление

<% @homework.homework_students.each do |homework_student| %> 
       <%= link_to "complete", complete_homework_path(@homework, homework_student), method: :patch %> 
       <% end %> 
+0

Похоже его от вашего link_to где вы ссылаетесь на домашнюю работу. это должно быть @ homework.id? Трудно сказать, не видя больше кода, но эта переменная, кажется, нигде не определена.Если в вашем контроллере он должен быть переменной экземпляра для доступа к нему в вашем представлении. Что говорит ваша трассировка журнала/стека при нажатии на полную ссылку? – user3366016

+0

Привет, я не могу добраться до ссылки, потому что страница не загружается. Я поставил @ homeework.id следующим образом: <% = link_to «Отметить как завершенную», complete_homework_homework_student_path (@homework_students, @ homeework.id), метод:: patch%>, и это ошибка ... Нет сопоставлений маршрутов {: action => "complete",: controller => "homework_students",: homework_id => nil,: id => "78"} отсутствуют необходимые ключи: [: homework_id] ... У меня нет контроллера homework_students, я только есть контроллер домашней работы. Я отправлю часть кода. – Co2

+0

Move '' do do patch: полный конец' выше один блок. У вас есть он вложен в контроллер homework_students. Затем запустите «rake routes», чтобы получить правильный путь. Также смотрите параметры. @homework_students - нуль (и в неправильном порядке). Скорее всего, вы просматриваете их в своем представлении, так что это, скорее всего, локальная переменная 'homework_students.id'. Но опять же, немного сложно сказать. – user3366016

ответ

1

Я издевался эту версию вверх на основе наших комментариев, и это работает на моем конце хотя это, возможно, не лучший подход. Вы можете посмотреть this video from Mackenzie Child, который использует ajax, чтобы сделать этот тип обновления в своем приложении todo (отметьте все как завершенное и т. Д.).

В вашем routes.rb

resources :homeworks do 
    member do 
     patch :complete 
    end 
    resources :homework_students 
end 

В вашем homework_controller.rb

def complete 
    # Loop over each matching homework_student for the @homework where the id matches and update the completed_on attribute. 
    # You need to get the indivual homework_student record and update it. You could do it other ways but this seemed to work for me. 
    @homework.homework_students.where(id: params[:home_work_students_id]).each do |homework_student| 
     homework_student.update_attributes(:completed_on => Time.now) 
    end 
    # Redirect back to the @homework view. 
    redirect_to @homework, notice: 'Homework was successfully marked as complete.'   
    end 

before_action :set_homework, only: [:show, :complete]

В вашей домашней show.html.erb

# This assumes you are looping over the @homework.homework_students in your view to create a link for each homework_student record and that will give you access to the homework_student local variable. 
<%= link_to "complete", complete_homework_path(:homework_id => @homework, :home_work_students_id => homework_student), method: :patch %> 
+0

Спасибо! Я очень ценю это. К сожалению, я все еще получаю неопределенную локальную переменную или метод 'homework_student 'после попытки ответа. Имя таблицы - homework_students. Я пропускаю что-то в своем контроллере или вижу довольно простой. Я на самом деле работал с видео. – Co2

+0

Я очень ценю время, я думаю, что у меня его почти нет ... ассоциации моделей правы, я пропустил что-то простое. – Co2

+0

Np. Здесь вы говорите, что homework_student не определено, но над вами говорят homework_students. Можете ли вы опубликовать полную ошибку как обновление вашего вопроса и кода вида? – user3366016