【问题标题】:How to pass params to new view in Ruby on Rails app?如何在 Ruby on Rails 应用程序中将参数传递给新视图?
【发布时间】:2015-05-17 22:47:26
【问题描述】:

我正在尝试制作简单的应用程序。我将我的名字和姓氏输入到简单的<%= 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

/views/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 %>

/views/data/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>

/models/data.rb

class Data
  include ActiveModel::Model
  attr_accessor :first_name, :second_name

  validates :first_name, :second_name, presence: true 
end

请帮助找出为什么参数没有传递到下一页。无论如何谢谢:D

【问题讨论】:

    标签: ruby-on-rails ruby ruby-on-rails-3 ruby-on-rails-4 model-view-controller


    【解决方案1】:

    您的视图应如下所示:

    <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 或其他名称,它会很快变得混乱:)

    【讨论】:

    • 仍然显示相同的undefined method first_name for nil:NilClass 错误。在错误日志中,我看到没有参数传递到该页面。
    • 您的index.html.erb 文件列出了数据库中的所有内容。如果您尚未创建任何内容,则会收到此错误。
    • 如何在不创建数据库的情况下做到这一点。请查看最后一个文件,我刚刚将其添加到问题中。
    • 如果没有数据库,您将需要以某种方式在index 控制器操作中创建@data 对象。此刻,它是空的。默认的 Rails 事情是在 create 操作中在数据库中创建一条记录,然后重定向到 show 页面以便您可以看到它。您当前的控制器中没有此操作,因此您的 create 操作中的 redirect_to @data 行将引发错误。我建议运行 Rails 脚手架生成器,然后查看生成的代码是如何工作的。这样您就可以看到它们正常工作时的样子。
    【解决方案2】:

    编辑:

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

    redirect_to(data_path(data: @data))
    

    在你的控制器的索引方法中:

    def index
      @data = Data.new(params[:data])
    end
    

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


    为了扩展马特的答案,您收到 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 模板将被重新呈现。如果保存正确,控制器将重定向到索引页面,您可以在其中调用您想要的特定数据对象并将其显示在您的视图中。

    【讨论】:

    • 不保存到数据库可以吗?它会使一切变得更加复杂,我不想保存它。想法是只使用一次数据。也许有办法。
    • 刚刚更新了我的答案,您应该能够将内存中的 @data 变量传递给重定向方法,然后在您的索引操作或您希望重定向到的任何地方构建另一个内存对象.希望对您有所帮助!。
    • 不知道为什么,但它不起作用。参数未传递到索引页面。
    • 仍然没有参数传递给索引页。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-03-24
    • 2015-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多