Как вы инициализируете объект в действии `new`, а затем обновляете его в` create`? - PullRequest
0 голосов
/ 25 марта 2012

Цель

Инициализируйте новую проблему с добавлением, которую пользователи решат при посещении /task. Они вводят свой ответ, и форма отправляется обратно /task. Действие new должно инициализировать проблему, поскольку пользователи не могут редактировать проблему, только предоставляют ответ. Действие create должно обновить таблицу addition_tasks в столбце answer с предоставленным пользователем ответом.

Задача

Как у меня сейчас, задача создана и успешно сохранена в действии new, но не обновляется с действием create.

Модель

# == Schema Information
#
# Table name: addition_tasks
#
#  id            :integer         not null, primary key
#  first_addend  :integer
#  second_addend :integer
#  sum           :integer
#  answer        :integer
#  correct       :boolean
#  created_at    :datetime        not null
#  updated_at    :datetime        not null
#

class AdditionTask < ActiveRecord::Base

  attr_accessible :answer

  belongs_to :user
end

Маршруты

  match 'task', to: 'addition_task#new'
  match 'task', to: 'addition_task#create'

Контроллер

class AdditionTaskController < ApplicationController

  respond_to :html, :js

  def new
    @task = AdditionTask.new
    @task = new_task(@task)
    @task.save
    session[:task_id] = @task.id
  end

  def create
    @task = AdditionTask.find(session[:task_id])
    @task.answer = params[:addition_task][:answer]
    respond_with :new
  end

  private

  def new_task(task)
    @task.first_addend = 1 + Random.rand(98)
    @task.second_addend = 1 + Random.rand(98)
    @task.sum = @task.first_addend + @task.second_addend
    @task
  end
end

View

%h1 Problem
:markdown
  Please answer the question below. You may press "Enter" from within the answer field, instead of clicking the button, in order to receive a new question.

#task-container
  .addend
    =@task.first_addend
  .operator
    +
  .addend
    =@task.second_addend
  .operator
    \=
  .answer
    =simple_form_for @task, url: task_path, defaults: {input_html: {class: 'span2'}}, html: { class: 'form-inline' } do |f|
      =f.input :answer, label: false
      =f.submit :submit, class: 'btn-primary btn-large pull-right', value: 'Answer'

%div
  =@task.sum

Ответы [ 3 ]

2 голосов
/ 25 марта 2012

Я думаю, что у вашего route.rb есть проблемы:

match 'task', to: 'addition_task#new'   
match 'task', to: 'addition_task#create' 

, так как Rails не будет знать, в каком случае он должен отправить запрос на какое действие.

Я предлагаю вам использовать маршруты RESTful:

resources :addition_tasks

, тогда он сгенерирует для вас 2 маршрута:

GET :new 
POST :create

для получения более подробной информации об использовании маршрута RESTful,пожалуйста, обратитесь к официальной документации рельсов.http://guides.rubyonrails.org/routing.html#paths-and-urls

2 голосов
/ 25 марта 2012

Вам нужно сохранить задание:

def create
  logger.info("session's task_id: #{session[:task_id]}")

  @task = AdditionTask.find(session[:task_id])
  logger.info("@task.id: #{@task.id}")

  @task.answer = params[:addition_task][:answer]
  logger.info("@task.answer: #{@task.answer}")

  @task.save
  logger.info("@task: #{@task.inspect}")

  respond_with(@task)
end
0 голосов
/ 26 марта 2012

Ответ Siwei и Ответ Ли оба дали отличные очки.

Благодаря некоторым людям в #rubyonrails я переместил код с create на update.Я также изменил свои маршруты, как предложил Сивей, и сохранил объект, как предложил Ли.Однако я использовал @obj.save! для получения некоторых полезных ошибок, если что-то пошло не так.

Новые маршруты

  resources :users
  resources :addition_tasks, path: 'task', only: [:new, :update]

  root to: 'site#home'
  match 'signup',  to: 'users#new'
  match 'signin',  to: 'sessions#new'

Новый контроллер

class AdditionTasksController < ApplicationController

  respond_to :html, :js

  def new
    @task = AdditionTask.new
    @task = new_task(@task)
    @task.save!
    session[:task_id] = @task.id
  end

  def update
    @task = AdditionTask.find(session[:task_id])
    @task.answer = params[:addition_task][:answer]
    @task.save!
    render action: :new
  end

  private

  def new_task(task)
    @task.first_addend = 1 + Random.rand(98)
    @task.second_addend = 1 + Random.rand(98)
    @task.sum = @task.first_addend + @task.second_addend
    @task
  end
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...