我正在尝试构建一个包含问题输入的表单,以及五个输入,每个输入代表一个答案选择。
我的问题是,在我的/show.html.erb
文件中,它会抛出一个我无法弄清楚的错误。
例如:
QUESTION
ANS1
ANS2
ANS3
ANS4
ANS5
这是我到目前为止所拥有的:
# app/views/mcqs/new.html.erb
<%= form_for :mcq, url: mcqs_path do |f| %>
<%= f.label :title %><br>
<%= f.text_field :q %>
<%= f.label :ans1 %><br>
<%= f.text_field :ans1 %>
<%= f.label :ans2 %><br>
<%= f.text_field :ans2 %>
<%= f.label :ans3 %><br>
<%= f.text_field :ans3 %>
<%= f.label :ans4 %><br>
<%= f.text_field :ans4 %>
<%= f.label :ans5 %><br>
<%= f.text_field :ans5 %>
<%= f.label :category_id %><br>
<%= f.number_field :category_id %>
<%= f.label :tags %><br>
<%= collection_check_boxes(:mcq, :tag_ids, Tag.all, :id, :name) %>
<%= f.submit %>
<% end %>
控制器:
# app/controllers/mcqs_controller.rb
class McqsController < ApplicationController
def new
@Mcq = Mcq.new
end
def index
@questions = Mcq.all
end
def show
@Mcq = Mcq.find(params[:id])
end
def create
@Mcq = Mcq.new(params[:mcqs])
# @Mcq.save returns a boolean indicating whether the article was saved or not.
if @Mcq.save
redirect_to @Mcq
else
render 'new'
end
end
end
观点:
# app/news/mcqs/show.html.erb
<strong>MCQ Title:</strong><br>
<%= mcq.q %>
<strong>Question Text:</strong><Br>
<%= mcq.ans1 %>
...<strong>MCQ Title:</strong><br>
<%= mcq.q %>
<strong>Question Text:</strong><Br>
<%= mcq.ans1 %>
...
错误:
NameError in Mcqs#show
Showing app/views/mcqs/show.html.erb where line #4 raised:
undefined local variable or method `mcq' for #<#
<Class:0x007fad811936e8>:0x007fad838a47a0>
<strong>MCQ Title:</strong><br>
<%= mcq.q %>
</p><p>
如果没有此错误,如何在new.html.erb
上显示show.html.erb
的输入? <%= @mcq.q %>
无效。
答案 0 :(得分:3)
在show
方法中,您创建@Mcq
作为Mcq.find(params[:id])
,然后在show
视图中,您希望以mcq
的形式访问它,这样您就可以了需要以与在控制器中声明它相同的方式(名称)访问它。
尝试:
<strong>MCQ Title:</strong><br>
<%= @Mcq.q %>
如果您在控制器上创建@mcq
(show
方法),然后您想在使用@Mcq
响应该方法的视图中访问它,那么您将收到一个NilClass
的对象,也就是说,如果名称不匹配,它们将无效。
此外,如果您在控制器上使用@mcq
,然后您想要以mcq
访问,这两个都不起作用,控制器上的那个是一个实例变量,可以使用在您的视图中来自您的控制器,第二个是局部变量,并且很可能会引发undefined local variable or method 'variable'
错误。
我可以用@Anhubaw引用:
本地变量和实例变量之间的主要区别在于本地变量 变量仅在控制器中可用,其中作为实例变量 也可以在相应的视图中找到。控制器和视图 不共享局部变量
答案 1 :(得分:1)
将控制器中的所有@mcp
更改为mcq
,并将所有@mcq
更改为:mcq
,同时将新视图中的@mcq
更改为{{1} }}
变量前缀@
表示它是一个实例变量,它可以在视图中访问,而普通变量不以@
开头只是一个局部变量,它只是可以用于控制器动作方法。