新手问题 要在哪个 action 里面做两个关联 model 的更新呢?

alphaliu · 2012年11月16日 · 最后由 AlphaLiu 回复于 2012年11月16日 · 3269 次阅读

我有两个 model,user 和 userinfo,其中 user has_one userinfo,user 登录后进入页面显示的是 user 和userinfo的信息,我想在这个页面加一个编辑按钮,允许用户修改这些信息,那应该对应users#edit还是userinfos#edit呢??因为我想在编辑页面一次修改user和userinfo。请教一下大家了,谢谢!

model 和 controller 不是一回事。 你的 controller 有几个,难道是两个,一个 userscontroller,一个 userinfoscontroller,应该是一个。

#1 楼 @woaigithub 请问一下,有两个 model 不是有两个 controller 吗?我有点搞混。也就是两个 model 可以由一个 controller 来操作?虽然我知道这问得很弱,但我是第一次自己写 rails 程序...

model 和 controller 不是一回事。 model 是你的对象模型,表示对象的关系。 controller 是响应请求用的,定位资源,和 model 没有直接关系。 没有强制 1:1,也不应该强制 1:1。

你是不是用 rails g scaffold user rails g scaffold user_info references:user 创建的结构。

问题不弱,刚开始大家都是弱的。不怕问题弱,你描述的很清楚,这样很好,大家就知道如何帮你。就怕有些人描述不清,大家想帮都不知道如何下手。

#4 楼 @woaigithub 不是,我是一个个 generate 出来的。model 和 controller 独立弄,但是之前看到的教程一般都是一个 model 有一个 controller,所以以为是这样。

其实你要修改的是一个资源,用户信息,只是你分成两个对象,将一部分属性分离出去了。一个 controller 就可以了!

#7 楼 @woaigithub 这样我就比较清楚了,谢谢!

#7 楼 @woaigithub 刚刚在写 View 的时候有个疑问,这样的两个 model 写 view 的时候要怎么用form_for呢??

#10 楼 @woaigithub 谢谢,看来我刚刚犯糊涂了...

#10 楼 @woaigithub 还有个疑问请教: 用了 form_for @user之后,block 里面关于 userinfo model 各个属性应该怎么写 formhelper?我用 f.text_field 怎么写都不对...

<%= form_for(@user) do |f| %>
  <% if @user.errors.any? %>
    <div id="error_explanation">
      <h2><%= pluralize(@user.errors.count, "error") %> prohibited this user from being saved:</h2>

      <ul>
      <% @user.errors.full_messages.each do |msg| %>
        <li><%= msg %></li>
      <% end %>
      </ul>
    </div>
  <% end %>

  <div class="field">
    <%= f.label :email %><br />
    <%= f.text_field :email %>
  </div>

  <%= f.fields_for :address do |address| %>
  <div class="field">
    <%= address.label :city %><br/>
    <%= address.text_field :city %>
  </div>

  <% end %>
  <div class="actions">
    <%= f.submit %>
  </div>
<% end %>

#13 楼 @woaigithub 这下子清楚了,谢谢了!

我这个例子是 user 和 address

class User < ActiveRecord::Base
  has_one :address
end

class Address < ActiveRecord::Base
  belongs_to :user
end

#15 楼 @woaigithub 我明白,这个 address 和我的 userinfo 差不多一样。

#13 楼 @woaigithub 最后再请教一下,这个

<%= f.fields_for :address do |address| %>
  <div class="field">
    <%= address.label :city %><br/>
    <%= address.text_field :city %>
  </div>

我照这写了一个 userinfo.real_name,虽然生成了<input id="user_userinfo_real_name" name="user[userinfo][real_name]" size="30" type="text"> 但是却没有显示 real_name 的值出来,是搞错了吗?

没有显示出来值,本身有值吗?

#18 楼 @woaigithub 本身有值的。不知道这跟我这个页面是 partial 有没有关系,我的 user 不是@user,而是在 render 这个页面的时候用 locals 传进来的。值都有的。

是因为没有查询,User.find(params[:id]) 只查询了 user 表的信息,没有查询 userinfo 表的信息。 应该是 <%= f.fields_for @user.address do |address| %>

#20 楼 @woaigithub 那原来你的 address 是怎么查的呢?我知道我的 user.userinfo 会查询,但怎么用到 fields_for 里呢?实在糊涂了。

===== 可以了, 用

fields_for user.userinfo

就没问题。谢谢!!

需要 登录 后方可回复, 如果你还没有账号请 注册新账号