Ruby on Rails:关联模型,我需要控制器来保存数据吗?

时间:2013-06-02 19:55:51

标签: ruby-on-rails ruby ruby-on-rails-3 associations

我是Ruby on Rails的新手,也许有人可以帮助我。

我有一个关联,我想知道我是否需要一个控制器来将数据保存到数据库表中?

我有 user.rb 型号

has_many :businesses

我有 business.rb 模型

belongs_to :user

我在商业迁移文件中有这个

class CreateBusinesses < ActiveRecord::Migration
  def change
    create_table :businesses do |t|
      t.integer :user_id
      t.string :name
      t.string :street
      t.string :state
      t.string :city
      t.integer :zip

      t.timestamps
    end
  end
end

我想知道是否需要创建一个控制器文件来将数据保存到业务表中?

我在views/users/profile.html.erb

中有类似的内容
<%= form_for(@user) do |f| %>
  <div class="field">
    <%= f.label :company_name %>
    <%= f.text_field :company_name %>
  </div>
  <div class="actions">
    <%= f.submit %>
  </div>
<% end %>

如何设置此表单以便我可以将我的:company_name保存到business表中:name也是如此,所以我还可以在这个表单中添加:street,:state等等?

我只生成了一个模型,而且还没有企业控制器。

谢谢!

2 个答案:

答案 0 :(得分:2)

您不一定需要业务控制器,但您需要一个用户控制器。您可以让用户控制器通过嵌套属性为用户保存关联对象。

首先,允许用户模型接受业务关系的嵌套属性:

user.rb

accepts_nested_attributes_for :business

然后将业务对象的fields__in添加到用户表单中:

<%= form_for(@user) do |f| %>
  <div class="field">
    <%= f.label :company_name %>
    <%= f.text_field :company_name %>
  </div>

  <%= fields_for :business do |fields| %>
    <%= fields.text_field :name %>
  <% end %>
  <div class="actions">
    <%= f.submit %>
  </div>
<% end %>

业务属性将作为参数user => {:name => 'Jim', :business_attributes => {:name => 'Jims business'}}

的一部分来实现

然后,您可以在用户控制器的创建或更新调用中直接将这些内容传递给用户对象的更新:

def update
  @user = User.find(params[:id])
  @user.update_attributes(params)
end

商业参数将由accepts_nested_attributes功能处理!

上面的示例解释了单个实例示例,因为您有has_many关系,您需要将上述内容作为起点,并学习如何调整它以允许许多子项。以下是一些资源,可以帮助您了解这一点,而不是为您提供完整的代码,而您却什么都学不到!

答案 1 :(得分:0)

当然你需要一个控制器。不一定是同一个控制器,但需要一个。

需要控制器来连接视图和模型。如果在提交数据时没有它,则无法发送数据。显然,数据库不会以这种方式修改。如果控制器中没有操作,您甚至无法显示视图。

没有相应容器的模型仅在与某个其他模型(如论坛 - 注释对)紧密相关时才使用。因此,您可以让用户控制器处理业务数据,但这并不是真的建议。