首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >如何在应用程序中传递params到新视图?

如何在应用程序中传递params到新视图?
EN

Stack Overflow用户
提问于 2015-05-17 22:47:26
回答 2查看 3.9K关注 0票数 0

我试着做一个简单的应用程序。我将我的名字和姓氏输入到简单的<%= form_for @data do |f| %> rails表单中,提交之后,应用程序应该像这样呈现简单的文本。My first name is <%= data.first_name %> and my last name is <%= data.last_name %>。我不知道为什么,但我的应用程序说的是这个错误:

未定义局部变量或方法“数据”

它可能是这么说的,因为没有传递参数来查看。

这是我的密码。

routes.rb

代码语言:javascript
代码运行次数:0
运行
复制
resources :data, only: [:new, :create, :index]

data_controller.rb

代码语言:javascript
代码运行次数:0
运行
复制
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

代码语言:javascript
代码运行次数:0
运行
复制
<%= 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

代码语言:javascript
代码运行次数:0
运行
复制
<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

代码语言:javascript
代码运行次数:0
运行
复制
class Data
  include ActiveModel::Model
  attr_accessor :first_name, :second_name

  validates :first_name, :second_name, presence: true 
end

请帮助找出为什么params不传递到下一页。无论如何,谢谢:D

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-05-17 22:54:06

您的观点应该如下所示:

代码语言:javascript
代码运行次数:0
运行
复制
<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的方法。一般来说,领域模型对应于现实世界中的事物,比如UserArticle,它们很容易理解和关联。如果您使用需要创建另一个模型并想将其命名为Data2或其他什么的话,它会变得非常混乱:)

票数 1
EN

Stack Overflow用户

发布于 2015-05-17 23:05:05

编辑:

由于您指定不希望使用数据库,我建议通过重定向传递对象参数:

代码语言:javascript
代码运行次数:0
运行
复制
redirect_to(data_path(data: @data))

在控制器的索引方法中:

代码语言:javascript
代码运行次数:0
运行
复制
def index
  @data = Data.new(params[:data])
end

现在您的视图应该正确呈现,因为您将内存中的@data对象属性作为重定向内的参数传递。然后在索引页或希望重定向到的任何地方重新创建此对象。

要扩展Matt的答案,您获得NilClass错误的原因是:

当路由文件中没有启用data#show操作时,您将重定向到show操作。既然您已经为索引设置了视图,那么当@data对象被验证为有效时,我假设您希望重定向到那里:

代码语言:javascript
代码运行次数:0
运行
复制
redirect_to data_path

但是,我建议您遵循Rails约定,并在您的data#show中指定routes.rb路由:

代码语言:javascript
代码运行次数:0
运行
复制
resources :data, only: [:index, :new, :create, :show]

在你的data_controller.rb中:

代码语言:javascript
代码运行次数:0
运行
复制
def show
  @data = Data.find(params[:id])
end

另一个问题是,在创建@data对象时,实际上并没有保存它。new方法填充属性,valid?在定义模型的指定上下文中运行所有验证,如果没有发现错误,则返回true,否则返回false。你想做这样的事情:

代码语言:javascript
代码运行次数:0
运行
复制
def create
  @data = Data.new(data_params) 

  if @data.save
    redirect_to data_path
  else
    render :new
  end
end

使用save尝试将记录保存到数据库,并以任何方式运行验证检查--如果验证失败,保存命令将返回false,记录将不会保存,new模板将被重新呈现。如果正确保存,控制器将重定向到索引页,在该页面中,您可以调用所需的特定数据对象,并在视图中显示它。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30292929

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档