如何在Ruby on Rails应用程序中向新视图传递参数



我想让简单的应用程序。我输入我的名字和姓氏到简单的<%= 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的方法。通常,领域模型对应于现实世界的事物,如UserArticle,它们易于理解和关联。如果你想创建另一个模型并将其命名为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模板将被重新呈现。如果保存得当,控制器将重定向到索引页,您可以在其中调用所需的特定数据对象并在视图中显示它。

相关内容

  • 没有找到相关文章

最新更新