我想让简单的应用程序。我输入我的名字和姓氏到简单的<%= form_for @data do |f| %>
rails表单,提交后,应用程序应该呈现这样的简单文本。My first name is <%= data.first_name %> and my last name is <%= data.last_name %>
。我不知道为什么,但我的应用程序说这个错误:
未定义的局部变量或方法' data'
可能是因为没有参数传递给视图。
这是我的代码。
routes.rb
resources :data, only: [:new, :create, :index]
data_controller.rb
class DataController < ApplicationController
def new
@data = Data.new
end
def index
end
def create
@data = Data.new(data_params)
if @data.valid?
redirect_to @data
else
render :new
end
end
private
def data_params
params.require(:data).permit(:first_name, :second_name)
end
end
/视图/数据/new.html.erb
<%= form_for @data do |f| %>
<%= f.label :first_name %>
<%= f.text_field :first_name %>
<%= f.label :second_name %>
<%= f.text_field :second_name %>
<%= f.submit 'Continue', class: 'button' %>
<% end %>
/视图/数据/index.html.erb
<h2>Coolest app ever :D</h2>
<p>My first name is: <%= data.first_name %>.</p>
<p>And my second name is: <%= data.second_name %>.</p>
/模型/data.rb
class Data
include ActiveModel::Model
attr_accessor :first_name, :second_name
validates :first_name, :second_name, presence: true
end
请帮忙找出为什么参数没有传递到下一页。D
你的视图应该是这样的:
<h2>Coolest app ever :D</h2>
<p>My first name is: <%= @data.first_name %>.</p>
<p>And my second name is: <%= @data.second_name %>.</p>
此外,我建议将模型称为像Data
这样的通用模型并不是非常适合rails的方法。通常,领域模型对应于现实世界的事物,如User
和Article
,它们易于理解和关联。如果你想创建另一个模型并将其命名为Data2
或其他的话这会很快让人感到困惑:)
既然您指定了不希望使用数据库,我建议通过重定向传递对象参数:
redirect_to(data_path(data: @data))
和在控制器的index方法中:
def index
@data = Data.new(params[:data])
end
现在您的视图应该正确呈现,因为您将内存中的@data
对象属性作为重定向中的参数传递。然后在索引页或您希望重定向到的任何位置重新创建此对象。
扩展Matt的回答,你得到NilClass错误的原因是:
当你的路由文件中没有启用show
动作时,你正在重定向到data#show
动作。由于您已经为索引设置了视图,我假设您希望在验证@data对象有效时重定向到那里:
redirect_to data_path
但是我建议你遵循Rails惯例,在你的routes.rb:
中指定data#show
路由。resources :data, only: [:index, :new, :create, :show]
和data_controller.rb:
def show
@data = Data.find(params[:id])
end
另一个问题是,在创建@data
对象时,实际上并没有保存。new
方法填充属性,valid?
在您定义的模型的指定上下文中运行所有验证,如果没有发现错误则返回true,否则返回false。你想做的是:
def create
@data = Data.new(data_params)
if @data.save
redirect_to data_path
else
render :new
end
end
使用save
尝试将记录保存到数据库,并运行验证检查-如果验证失败,保存命令将返回false,记录将不被保存,并且new
模板将被重新呈现。如果保存得当,控制器将重定向到索引页,您可以在其中调用所需的特定数据对象并在视图中显示它。