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

Для рендеринга моих частичных изображений в моем новом представлении:

<%= render partial: "quiz", locals: { url: quiz_bs_path } %>

И в моем представлении редактирования:

<%= render partial: "quiz", locals: { url: edit_quiz_b_path } %>

Локации link_to взяты из результатов моих рейк-маршрутов:

        quiz_bs GET    /quiz_bs(.:format)             quiz_bs#index
                POST   /quiz_bs(.:format)             quiz_bs#create
     new_quiz_b GET    /quiz_bs/new(.:format)         quiz_bs#new
    edit_quiz_b GET    /quiz_bs/:id/edit(.:format)    quiz_bs#edit
         quiz_b GET    /quiz_bs/:id(.:format)         quiz_bs#show
                PATCH  /quiz_bs/:id(.:format)         quiz_bs#update
                PUT    /quiz_bs/:id(.:format)         quiz_bs#update
                DELETE /quiz_bs/:id(.:format)         quiz_bs#destroy

Я получаю сообщение об ошибке аргумента в режиме редактирования: First argument in form cannot contain nil or be empty. Строка, в которой вызывается ошибка, находится в моем партиале:

<%= form_for @quiz_bs, url: url, method: :post do |f| %>

Мой код контроллера:

class QuizBsController < ApplicationController
before_action :require_sign_in

def show
@quiz_bs = QuizBs.find(params[:id])
end

def new
  @quiz_bs = current_user.quiz_bs || current_user.build_quiz_bs
end

def create
@quiz_bs = QuizBs.new

@quiz_bs.bs01 = params[:quiz_bs][:bs01]
@quiz_bs.bs02 = params[:quiz_bs][:bs02]
@quiz_bs.bs03 = params[:quiz_bs][:bs03]
@quiz_bs.bs04 = params[:quiz_bs][:bs04]
@quiz_bs.bs05 = params[:quiz_bs][:bs05]
@quiz_bs.bs06 = params[:quiz_bs][:bs06]

@quiz_bs.user = current_user

if @quiz_bs.save
  flash[:notice] = "Quiz results saved successfully."
  redirect_to user_path(current_user)
else
  flash[:alert] = "Sorry, your quiz results failed to save."
  redirect_to welcome_index_path
end
end

def update
@quiz_bs = QuizBs.find(params[:quiz_bs])

@quiz_bs.assign_attributes(quiz_bs_params)

if @quiz_bs.save
  flash[:notice] = "Post was updated successfully."
  redirect_to user_path(current_user)
else
  flash.now[:alert] = "There was an error saving the post. Please try again."
  redirect_to welcome_index_path
end
end

private
def quiz_bs_params
  params.require(:quiz_bs).permit(:bs01, :bs02, :bs03, :bs04, :bs05, :bs06)
end

end

Модель является:

class QuizBs < ActiveRecord::Base
  before_save :set_bscode

  def set_bscode
    self.bscode = "#{self.bs01}#{self.bs02}#{self.bs03}-#{self.bs04}#{self.bs05}#{self.bs06}"
  end

  belongs_to :user
  validates :user, presence: true
end

Есть идеи, где я ошибаюсь?

-2
Liz 28 Апр 2016 в 17:17

4 ответа

Лучший ответ

Сделайте это проще: если вы хотите назначить current_user, метод create подойдет вам.

< Сильный > Частичная :

#new.html.erb
<%= render partial: "quiz", locals: {quiz: @quiz_bs, url: :quiz_bs } %>


#edit.html.erb
<%= render partial: "quiz", locals: {quiz: @quiz_bs, url: :quiz_b } %>

Форма:

#_form.html.erb

<%= form_for quiz, url: url do |f| %>

Контроллер:

def new
  @quiz_bs = QuisBs.new
end
0
7urkm3n 28 Апр 2016 в 14:43

Некоторые обновления вашего контроллера:

before_action :assign_quiz_bs, only: [:show, :edit, :update, :destroy]
#...   
def update
   @quiz_bs.update(quiz_bs_params)

   # .... rendering ...
end

private

def assign_quiz_bs
   @quiz_bs = Quiz.find(params[:id])
end

def quiz_bs_params
   params.require(:quiz_bs).permit(:bs01, :bs02, :bs03, :bs04, :bs05, :bs06)
end
0
Малъ Скрылевъ 28 Апр 2016 в 19:47

Нет необходимости создавать методы RESTfull в контроллере, но если вы используете его, как я вижу @quiz_bs, вам нужно сначала инициализировать его, затем вы можете его использовать. В новом представлении вы инициализируете {{X1} } по

@quiz_bs = current_user.quiz_bs || current_user.build_quiz_bs

Тогда вы его используете.

А также routes, который создается для edit, необходим id, т.е.

edit_quiz_b GET    /quiz_bs/:id/edit(.:format)    quiz_bs#edit

Так что вам придется пройти @quiz_bs как

edit_quiz_b_path(@quiz_bs)

Понял?

0
Rahul 28 Апр 2016 в 14:53

У вас нет действия edit в контроллере, поэтому rails предполагает, что он пуст. Таким образом, @quiz_bs действительно nil

Добавить что-то вроде

def edit
  @quiz_bs = QuizBs.find(params[:id])
end

Также в вашем update действии params[:quiz_bs], скорее всего, тоже nil, и его следует изменить на params[:id]

0
Vasfed 28 Апр 2016 в 14:43