2017-05-25 52 views
0

我正在尝试构建一个表单,其中包含一个问题输入和五个输入,每个输入表示一个答案选项。Rails视图无法显示表单输入参数

我的问题是在我的/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.erbshow.html.erb输入没有这个错误? <%= @mcq.q %>不起作用。

回答

3

在你show方法创建@McqMcq.find(params[:id]),但随后在show视图要访问它作为mcq,所以你需要访问它以同样的方式(姓名),你在控制器中声明它。

尝试:

<strong>MCQ Title:</strong><br> 
<%= @Mcq.q %> 

如果创建控制器(show法)在@mcq,然后你要访问它在响应使用@Mcq该方法的观点,那么你将获得与NilClass对象,也就是说,如果名称不匹配,他们将无法正常工作。

此外,如果你的控制器上使用@mcq,然后你要访问的mcq,这是行不通的都不是,你的控制器上的一个实例变量,可以将你的意见,从你的控制器来内使用,第二个是局部变量,最有可能会引发一个undefined local variable or method 'variable'错误。

我可以给一起@Anhubaw:

The main difference between local and instance variable is that local variable is only available in controller, where as instance variable is available in corresponding views also. The controller and views do not share local variables

+0

你能解释@Mcq和mcq之间的区别吗? @符号和capilations差异?为什么这有关系? – mazing

+1

我更新了答案@mazing,试着自己去看看不同之处。 –

+0

感谢您的好解释!:) – mazing

1

更改所有@Mcq在控制器@mcp,鉴于改变所有mcq@mcq,也是在新的视图改变:mcq@mcq

变量前缀@表示它是一个实例变量,它可以在视图中访问,而普通变量不以@开头只是一个局部变量,它只能用在控制器的操作方法。

+0

这不起作用,显示字段现在只显示空白结果。谢谢你! – mazing