【问题标题】:Ruby on Rails: Using form_for to pass arguments to controllers to create/initilize objectsRuby on Rails:使用 form_for 将参数传递给控制器​​以创建/初始化对象
【发布时间】:2013-11-20 08:35:13
【问题描述】:

我在尝试使用 form_for 创建新对象“Investor”时遇到各种错误。

我只用一个属性 (:name) 尽可能简单地设置它,但我认为我没有正确传递参数......或者可能需要在 create.html.rb 文件中定义模板? ...或者应该在 config/routes 中添加一些东西来定义创建的含义,但我不确定解决方案是什么或我做错了什么,尽管它可能是基本的......但我可以似乎没有解决它或找到使用 form_for 创建具有多个参数/参数的新对象的正确方法。我收到错误消息 - Investor/create “模板丢失”,所以我想知道我是否需要创建模板...?

目前我在 def new @investor = Investor.new 中有一个错误,甚至不应该使用它,因为我试图创建一个带参数的对象,而不是没有任何参数的对象,但是当我采取从控制器中取出 def new ,我得到一个完全不同的错误,说在 form_for 行“表单中的第一个参数不能为 nil 或空”中有一个 argumentError (rb:10) 这是我之前遇到的错误之一,所以我'开始觉得我在旋转我的轮子,但是当我按照示例进行操作时,我遇到了错误,所以也许有更多经验的人可以指出我的错误。

否则,当我像 Investor.new(:name) 或“name”一样发送它时,我会收到一个缺少的 stringify_method 错误,所以我遇到的问题可能是我不知道传递多个参数的正确方法在控制器中,但即使我尝试只用一个来做这件事,按照我设置的方式创建一个新的 Investor 对象似乎仍然存在问题。有任何想法吗?

哪个更正确/有什么区别?: def create Investor.create(params[]) end def create Investor.new(params[]) end

我找不到任何简单的示例来说明如何使用控制器和模型来使用 form_for 创建对象。本教程展示了如何创建用户对象的简单示例,但我认为当您首先生成用户模型以创建迁移然后使用 form_for 创建新用户、投资者或任何对象的对象时,过程和语法有点不同其他实体。

在线示例中似乎遗漏了许多细节,因为显然有许多不同的方法可以做到这一点(教程使用(名称,选项{})作为一个示例,其他示例使用 args*),好吧,我可以使用我创建的这个按比例缩小的简单示例无法使其正常工作,所以我想我会把它贴在这里寻求帮助。

谢谢! 卡梅隆

控制器:

class InvestorsController < ApplicationController
respond_to :html

def new
    @investor = Investor.new
end

def create
    @investor = Investor.create(investor_params)
end

def investor_params
    allow = [:name]
    params.require(investor).permit(allow)
end
end

型号:

class Investor < ActiveRecord::Base
    include ActiveModel::Validations
       attr_accessor :name
         validates :name, presence: true    
    end
end

<%= form_for @investor do |f| %>
  <%= f.label :name %>
  <%= f.text_field :name %>
  <%= f.submit "Create my account" %>
<% end %>

路线:

Tycoon::Application.routes.draw do
resources :investors, only: [:new,:create]
root 'static_pages#home'
match '/help',    to: 'static_pages#help',    via: 'get'
match '/investors/new', to: 'investors#new',    via: 'get'
match '/about',   to: 'static_pages#about',   via: 'get'
match '/contact', to: 'static_pages#contact', via: 'get'
get "static_pages/home"

【问题讨论】:

    标签: ruby-on-rails ruby model form-for


    【解决方案1】:

    试试这个。 控制器:

    class InvestorsController < ApplicationController
      respond_to :html
    
      def new
        @investor = Investor.new
      end
    
      def create
        @investor = Investor.create(investor_params)
      end
    
      private
    
      def investor_params
        params.require(:investor).permit(:name)
      end
    end
    

    型号:

    class Investor < ActiveRecord::Base
      validates :name, presence: true    
    end
    

    查看:

    <%= form_for @investor do |f| %>
      <%= f.label :name %>
      <%= f.text_field :name %>
      <%= f.submit "Create my account" %>
    <% end %>
    

    路线:

    Tycoon::Application.routes.draw do
      resources :investors, only: [:new,:create]
      root 'static_pages#home'
      match '/help',    to: 'static_pages#help',    via: 'get'
      match '/about',   to: 'static_pages#about',   via: 'get'
      match '/contact', to: 'static_pages#contact', via: 'get'
      get "static_pages/home"
    end
    

    【讨论】:

    • 感谢 Anton,我按照您的建议对其进行了编辑,并且表单页面仍然显示,但是当我提交名称时,我收到一条错误消息,提示缺少模板投资者/创建,应用程序/使用 {:locale= 创建[zh], :formats......]} 搜索:* "/home/...app/views"
    • 是否需要 def 初始化函数?当我添加一个错误的参数错误时,不确定现在该往哪个方向发展?感谢您的帮助
    • 它只是说您的 InvestorsController#create 操作没有视图。要解决此问题,您应该创建 app/views/investors/create.html.erb 文件。或者在#create 操作的末尾添加redirect_to root_path 之类的内容。
    猜你喜欢
    • 2013-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多