1

我正在尝试从text_area表单中的字段中获取文本,以使用当前模型的 ID 保存到不同模型中的数据库。

目前,这有效,但只会保存整数。如果我将文本放入“注释”字段,则将其保存为“0”。我怀疑这工作正常,但我的难题缺少一块。这是因为我只希望“票证”保存 note_id,因为每个“票证”将有多个“备注”。

如何使用 ID 将 Note 保存在 Note Model 中,并将其note_id与此特定工单相关联?

表单 - /app/views/tickets/_form.html.erb

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

<div class="field">
  <%= f.fields_for :notes do |u|%>
  <%= u.label :note %>
  <%= u.text_area :note, :size => "101x4", :placeholder => "Leave notes here." %>
<% end %>
</div>

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

票证_controller.rb

class TicketsController < ApplicationController
# GET /tickets
# GET /tickets.json
def index
@tickets = Ticket.all

respond_to do |format|
  format.html # index.html.erb
  format.json { render json: @tickets }
end
end

# GET /tickets/1
# GET /tickets/1.json
def show
@ticket = Ticket.find(params[:id])

respond_to do |format|
  format.html # show.html.erb
  format.json { render json: @ticket }
end
end

# GET /tickets/new
# GET /tickets/new.json
def new
@ticket = Ticket.new
@ticket.notes.build

respond_to do |format|
  format.html # new.html.erb
  format.json { render json: @ticket }
end
end

# GET /tickets/1/edit
def edit
@ticket = Ticket.find(params[:id])
end

# POST /tickets
# POST /tickets.json
def create
@ticket = Ticket.new(params[:ticket])

respond_to do |format|
  if @ticket.save
    format.html { redirect_to @ticket, notice: 'Ticket was successfully created.' }
    format.json { render json: @ticket, status: :created, location: @ticket }
  else
    format.html { render action: "new" }
    format.json { render json: @ticket.errors, status: :unprocessable_entity }
  end
end
end

# PUT /tickets/1
# PUT /tickets/1.json
def update
@ticket = Ticket.find(params[:id])

respond_to do |format|
  if @ticket.update_attributes(params[:ticket])
    format.html { redirect_to @ticket, notice: 'Ticket was successfully updated.' }
    format.json { head :no_content }
  else
    format.html { render action: "edit" }
    format.json { render json: @ticket.errors, status: :unprocessable_entity }
  end
end
end

# DELETE /tickets/1
# DELETE /tickets/1.json
def destroy
@ticket = Ticket.find(params[:id])
@ticket.destroy

respond_to do |format|
  format.html { redirect_to tickets_url }
  format.json { head :no_content }
end
end
end

笔记.rb

class Note < ActiveRecord::Base
belongs_to :ticket
attr_accessible :note, :ticket_id
end

票务.rb

class Ticket < ActiveRecord::Base
attr_accessible :notes_attributes
accepts_nested_attributes_for :notes
end
4

2 回答 2

4

这是因为note_id是一种integer类型。

使用nested models参考这个嵌套模型

模型:

class Ticket < ActiveRecord::Base
  has_many :notes
  attr_accessible :note_id, :notes_attributes
  accepts_nested_attributes_for :notes
end

看法:

<%= form_for(@ticket) do |f| %>
    <%= f.fields_for :notes do |u|%>
      <%= u.label :note %>
      <%= u.text_area :note %>
    <% end %>
    <%= f.submit 'Submit' %>
<% end %>
于 2013-04-08T17:54:04.473 回答
2

你所拥有的是一个嵌套关联,Ticket作为“父级”。关联由从模型中note_id的链接到. 您现在正在做的是手动操作该数字关联。Rails 知道该列应该是一个整数,它正在获取您尝试插入的文本并将其转换为一个数字(在这种情况下为零)。因此,您现在可能有一堆孤立的行。NoteidTicketnote_id

最终,为了完成您想要做的事情,您的表单将需要为该关联模型提供字段。处理此问题的一种方法是accepts_nested_attributes_forTicket模型中使用。像这样:

class Ticket < ActiveRecord::Base
    has_many :notes
    accepts_nested_attributes_for :notes
end

在您的表单中,您可以轻松地创建一个嵌套表单,如下所示:

<%= form_for(@ticket) do |f| %>
   <div class="field">
        <%= f.fields_for :notes do |f_notes|%>
            <%= f_notes.label :note %><br />
            <%= f_notes.text_area :note, :size => "101x4", :placeholder => "Please leave notes here."%>
        <% end %>
    </div>
<% end %>

编辑几乎忘记了:查看Ryan Bates处理嵌套属性的Railscast

编辑 2正如 codeit 指出的那样,您不需要attr_accessible :note_idin Ticket。由于您已经指出 aTicket有很多Notes,并且Note属于Ticket,因此外键列将在Note模型中显示为ticket_id,您已经拥有了。在票据模型中使用 note_id 是没有用的,而且也是荒谬的,因为 has_many 描述了复数关系(不能用单列表示)。

于 2013-04-08T17:59:33.853 回答