Rails视图无法显示表单输入参数

时间:2017-05-25 03:14:23

标签: ruby-on-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.erb上显示show.html.erb的输入? <%= @mcq.q %>无效。

2 个答案:

答案 0 :(得分:3)

show方法中,您创建@Mcq作为Mcq.find(params[:id]),然后在show视图中,您希望以mcq的形式访问它,这样您就可以了需要以与在控制器中声明它相同的方式(名称)访问它。

尝试:

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

如果您在控制器上创建@mcqshow方法),然后您想在使用@Mcq响应该方法的视图中访问它,那么您将收到一个NilClass的对象,也就是说,如果名称不匹配,它们将无效。

此外,如果您在控制器上使用@mcq,然后您想要以mcq访问,这两个都不起作用,控制器上的那个是一个实例变量,可以使用在您的视图中来自您的控制器,第二个是局部变量,并且很可能会引发undefined local variable or method 'variable'错误。

我可以用@Anhubaw引用:

  

本地变量和实例变量之间的主要区别在于本地变量   变量仅在控制器中可用,其中作为实例变量   也可以在相应的视图中找到。控制器和视图   不共享局部变量

答案 1 :(得分:1)

将控制器中的所有@mcp更改为mcq,并将所有@mcq更改为:mcq,同时将新视图中的@mcq更改为{{1} }}

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