如何将嵌套表单属性保存到数据库

发布于 2024-09-01 02:35:31 字数 2563 浏览 5 评论 0原文

我不太明白嵌套属性在 Rails 中是如何工作的。

我有 2 个模型:帐户和用户。帐户有_许多用户。当新用户填写表单时,Rails 会报告

User(#2164802740) expected, got Array(#2148376200)

Can Rails not read thenested attribute from the form?我该如何修复它?如何将嵌套属性中的数据保存到数据库中?

谢谢大家~

MVC如下:

账户模型

class Account < ActiveRecord::Base
  has_many :users
  accepts_nested_attributes_for :users

  validates_presence_of       :company_name, :message => "companyname is required."
  validates_presence_of       :company_website, :message => "website is required."
end

用户模型

class User < ActiveRecord::Base
  belongs_to :account

  validates_presence_of         :user_name, :message => "username too short."
  validates_presence_of         :password, :message => "password too short."
end

账户控制器

class AccountController < ApplicationController
  def new
  end

  def created
  end

  def create
    @account = Account.new(params[:account])
    if @account.save
      redirect_to :action => "created"
    else
      flash[:notice] = "error!!!"
      render :action => "new"
    end
  end
end

账户/新视图

<h1>Account#new</h1>

<% form_for :account, :url => { :action => "create" } do |f| %>
    <% f.fields_for :users do |ff| %>
    <p>
        <%= ff.label :user_name %><br />
        <%= ff.text_field :user_name %>
    </p>
    <p>
        <%= ff.label :password %><br />
        <%= ff.password_field :password %>
    </p>
    <% end %>
    <p>
        <%= f.label :company_name %><br />
        <%= f.text_field :company_name %>
    </p>
    <p>
        <%= f.label :company_website %><br />
        <%= f.text_field :company_website %>
    </p>
<% end %>

账户迁移

class CreateAccounts < ActiveRecord::Migration
  def self.up
    create_table :accounts do |t|
      t.string :company_name
      t.string :company_website

      t.timestamps
    end
  end

  def self.down
    drop_table :accounts
  end
end

用户迁移

class CreateUsers < ActiveRecord::Migration
  def self.up
    create_table :users do |t|
      t.string :user_name
      t.string :password
      t.integer :account_id

      t.timestamps
    end
  end

  def self.down
    drop_table :users
  end
end

谢谢大家。 :)

I do not really understand how nested attributes work in Rails.

I have 2 models, Accounts and Users. Account has_many Users. When a new user fills in the form, Rails reports

User(#2164802740) expected, got Array(#2148376200)

Can Rails not read the nested attributes from the form? How can I fix it? How can I save the data from nested attributes to the database?

Thanks all~

Here are the MVCs:

Account Model

class Account < ActiveRecord::Base
  has_many :users
  accepts_nested_attributes_for :users

  validates_presence_of       :company_name, :message => "companyname is required."
  validates_presence_of       :company_website, :message => "website is required."
end

User Model

class User < ActiveRecord::Base
  belongs_to :account

  validates_presence_of         :user_name, :message => "username too short."
  validates_presence_of         :password, :message => "password too short."
end

Account Controller

class AccountController < ApplicationController
  def new
  end

  def created
  end

  def create
    @account = Account.new(params[:account])
    if @account.save
      redirect_to :action => "created"
    else
      flash[:notice] = "error!!!"
      render :action => "new"
    end
  end
end

Account/new View

<h1>Account#new</h1>

<% form_for :account, :url => { :action => "create" } do |f| %>
    <% f.fields_for :users do |ff| %>
    <p>
        <%= ff.label :user_name %><br />
        <%= ff.text_field :user_name %>
    </p>
    <p>
        <%= ff.label :password %><br />
        <%= ff.password_field :password %>
    </p>
    <% end %>
    <p>
        <%= f.label :company_name %><br />
        <%= f.text_field :company_name %>
    </p>
    <p>
        <%= f.label :company_website %><br />
        <%= f.text_field :company_website %>
    </p>
<% end %>

Account Migration

class CreateAccounts < ActiveRecord::Migration
  def self.up
    create_table :accounts do |t|
      t.string :company_name
      t.string :company_website

      t.timestamps
    end
  end

  def self.down
    drop_table :accounts
  end
end

User Migration

class CreateUsers < ActiveRecord::Migration
  def self.up
    create_table :users do |t|
      t.string :user_name
      t.string :password
      t.integer :account_id

      t.timestamps
    end
  end

  def self.down
    drop_table :users
  end
end

Thanks everyone. :)

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

听闻余生 2024-09-08 02:35:31

将以下视图区域:更改

<% form_for :account, :url => { :action => "create" } do |f| %>

为:

<% form_for @account do |f| %>

在控制器内,您应该有类似这样的内容:

def new
  @account = Account.new
  # the new empty account doesn't have any users
  # so the user fields inside your view won't appear unless you specify otherwise:
  @account.users.build
  @account.users.build
  @account.users.build
end

Change the following view region:

<% form_for :account, :url => { :action => "create" } do |f| %>

into:

<% form_for @account do |f| %>

Inside your controller you should have something like this:

def new
  @account = Account.new
  # the new empty account doesn't have any users
  # so the user fields inside your view won't appear unless you specify otherwise:
  @account.users.build
  @account.users.build
  @account.users.build
end
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文