2016-04-28 59 views
-2

在我的网站上,用户既可以参加又可以重新参加测验,这意味着我将在部分视图中使用测验代码,该视图将被编辑视图和新视图使用。Ruby on Rails Partial Locals

为了使我的谐音我有我的新观点:

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

我收到一个参数呃ror在我的编辑视图中说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 

任何想法,我我错了吗?

+0

试通'quiz'在线,没有当地人的使用 –

+0

检查以确保'@ quiz_bs'是正确的。 – vee

+1

您在哪个操作中收到错误?新的或编辑?另请发布您的控制器代码。 – Pavan

回答

0

保持它更简单,如果你想分配以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

您在控制器中没有edit操作,因此rails会认为它是空的。因此@quiz_bs真的nil

添加类似

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

也在你update行动params[:quiz_bs]是最有可能nil也应加以改变,以params[:id]

+0

我看到了不需要空操作的情况。 –

+0

@МалъСкрылевъ不是在这种情况下,当OP需要动作来设置实例变量 – Vasfed

0

这是没有必要CRE吃了问题的REST方法在控制,但如果你使用它,因为我可以看到@quiz_bs那么你将不得不对其进行初始化第一,那么你可以使用它,在你的新观点,你初始化@quiz_bs通过

@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

我尝试改变路径,因为你建议,但它仍然给出相同的'无法找到与ID'='错误QuizBs。 – Liz

+0

您是否在控制器上定义了'编辑'方法? 'def edit @quiz_bs = QuizBs.find(params [:id]) end' – Rahul

0

某些更新到你的控制器:

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