我试着做一个简单的应用程序。我将我的名字和姓氏输入到简单的<%= form_for @data do |f| %>
rails表单中,提交之后,应用程序应该像这样呈现简单的文本。My first name is <%= data.first_name %> and my last name is <%= data.last_name %>
。我不知道为什么,但我的应用程序说的是这个错误:
未定义局部变量或方法“数据”
它可能是这么说的,因为没有传递参数来查看。
这是我的密码。
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
/view/data/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>
/模型/数据b
class Data
include ActiveModel::Model
attr_accessor :first_name, :second_name
validates :first_name, :second_name, presence: true
end
请帮助找出为什么params不传递到下一页。无论如何,谢谢:D
发布于 2015-05-17 14:54:06
您的观点应该如下所示:
<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-y的方法。一般来说,领域模型对应于现实世界中的事物,比如User
和Article
,它们很容易理解和关联。如果您使用需要创建另一个模型并想将其命名为Data2
或其他什么的话,它会变得非常混乱:)
发布于 2015-05-17 15:05:05
编辑:
由于您指定不希望使用数据库,我建议通过重定向传递对象参数:
redirect_to(data_path(data: @data))
在控制器的索引方法中:
def index
@data = Data.new(params[:data])
end
现在您的视图应该正确呈现,因为您将内存中的@data
对象属性作为重定向内的参数传递。然后在索引页或希望重定向到的任何地方重新创建此对象。
要扩展Matt的答案,您获得NilClass错误的原因是:
当路由文件中没有启用data#show
操作时,您将重定向到show
操作。既然您已经为索引设置了视图,那么当@data对象被验证为有效时,我假设您希望重定向到那里:
redirect_to data_path
但是,我建议您遵循Rails约定,并在您的data#show
中指定routes.rb路由:
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
模板将被重新呈现。如果正确保存,控制器将重定向到索引页,在该页面中,您可以调用所需的特定数据对象,并在视图中显示它。
https://stackoverflow.com/questions/30292929
复制相似问题