【问题标题】:Ruby on Rails Partial LocalsRuby on Rails 局部局部变量
【发布时间】:2016-08-23 09:05:38
【问题描述】:

在我的网站上,用户可以参加和重新参加测验,这意味着我将在部分视图中使用测验代码,编辑和新视图都将使用该代码。

要渲染我在新视图中的部分:

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

在我的编辑视图中:

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

link_to 位置来自我的 rake routes 结果:

        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。调用错误的行在我的部分:

&lt;%= form_for @quiz_bs, url: url, method: :post do |f| %&gt;

我的控制器代码是:

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

任何想法我哪里出错了?

【问题讨论】:

  • 尝试通过 quiz 内联,不使用本地人
  • 检查以确保@quiz_bs 正确。
  • 您在哪个操作上收到错误?新的还是编辑的?另请发布您的控制器代码。
  • 在没有本地人的情况下通过内联测验要好得多(并进行了编辑以反映它),但它只是更改了错误代码。我还展示了我的 quiz_bs 控制器。
  • 您的控制器没有编辑操作。你错过了吗?

标签: ruby-on-rails ruby partials


【解决方案1】:

控制器的一些更新:

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

【讨论】:

    【解决方案2】:

    没有必要在控制器中创建 RESTfull 方法,但如果您正在使用它,我可以看到 @quiz_bs 那么您必须先初始化它然后才能使用它,在您的新视图中初始化 @quiz_bs

    @quiz_bs = current_user.quiz_bs || current_user.build_quiz_bs
    

    那么你正在使用它。

    还有为edit生成的routes需要id,即

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

    所以你必须通过@quiz_bslike

    edit_quiz_b_path(@quiz_bs)
    

    知道了吗?

    【讨论】:

    • 我确实尝试按照您的建议更改路径,但它仍然给出相同的Couldn't find QuizBs with 'id'= 错误。
    • 您是否在控制器上定义了edit 方法? def edit @quiz_bs = QuizBs.find(params[:id]) end
    【解决方案3】:

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

    添加类似的东西

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

    在您的update 操作中params[:quiz_bs] 也很可能也是nil,应更改为params[:id]

    【讨论】:

    • 我看到了不需要空操作的情况。
    • @МалъСкрылевъ 在这种情况下不是,当 OP 需要操作来设置实例变量时
    【解决方案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
    

    【讨论】:

      猜你喜欢
      • 2011-12-21
      • 2018-05-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-10
      • 1970-01-01
      • 2014-01-31
      相关资源
      最近更新 更多