Ruby on Rails如何将id传递到新建表单中

4

好的,我已经寻找了许多资料、观看了视频,但在这方面仍然一无所获。我在这里阅读了类似的问题,但是这些问题更加复杂或者缺乏答案——所以接下来就是我的问题……

我有两个模型:Account(账户)和Invoice(发票)。当显示一个账户时,我想要一个链接来“创建新发票”,并将其关联到该账户。(稍后我实际上希望在创建发票时选择一个账户,但我将把这留给另一个问题。)

以下是我的模型:

Account:
class Account < ActiveRecord::Base
  attr_accessible :name, :invoice 
  attr_accessible :name, :invoice
  has_many :invoices
end

发票:

class Invoice < ActiveRecord::Base
  belongs_to :account
  attr_accessible :amount_pretax, :amount_total, :date_sent, :project, :status, :tax, :account, :account_id
end

现在,在我的/views/accounts/show.html.erb中。
<p id="notice"><%= notice %></p>
<p>
  <b>Name:</b>
  <%= @account.name %>
</p>
<%= link_to 'New Invoice', new_invoice_path(:account_id=>@account.id) %>
<%= link_to 'Edit', edit_account_path(@account) %> |
<%= link_to 'Back', accounts_path %>

所以,现在的情况是,当我点击“新发票”链接时,它会显示新的表单,其中账户字段填充了这个奇怪的文本:#<Account:0x10fe16bc0>,然后当我提交表单时,我会得到这个错误: ActiveRecord::AssociationTypeMismatch in InvoicesController#create 伴随着这个语句:Account(#2281084000) expected, got String(#2267210740) 还有这个:

app/controllers/invoices_controller.rb:45:in `new'
app/controllers/invoices_controller.rb:45:in `create'

以下是发票控制器中的内容:

def new
  @invoice = Invoice.new(:account_id => params[:account_id])
  respond_to do |format|
  format.html # new.html.erb
  format.json { render :json => @invoice }
  end
end

def create
  @invoice = Invoice.new(params[:invoice])
   ....
end

以下是我认为出错的地方,但是目前我不知道在这些行中应该放什么。我完全是一个初学者,在解决这个功能方面提供任何帮助肯定会教给我很多。

感谢您的时间。


你的错误在发票控制器中,因此最好在你的问题中展示相应的代码,以及相关的表单。 - siekfried
@siekfried 谢谢,我已经更新了控制器的代码,表单只是由新发票生成的通用表单。这有帮助吗? - Mark
@siekfried 给了我一个 NameError 错误,你是不是想说 [invoice] 而不是 [:invoice]? 我也尝试了那个但没成功。 - Mark
2个回答

3
当您在 /views/accounts/show 页面单击 New invoice 链接时,我认为您希望您的新发票属于此账户。
因此,在您的表单中,您不必让用户选择一个帐户。例如,您可以用 hidden_field 替换相应的字段:
<%= f.hidden_field :account_id, :value => params[:account_id] %>

在您的控制器的new操作中,将@invoice = Invoice.new(:account_id => params[:account_id])替换为@invoice = Invoice.new
希望这可以帮到您。

太棒了,谢谢@siekfried - 它完美地工作了!还让我对它应该如何工作有了一些见解,非常感谢。 - Mark

0

你没有发布表单的代码,但我猜测你正在使用文本字段来处理“account”关联。这是错误的!

如果你使用文本字段,那么Rails将尝试将其存储为字符串 => Account(#2281084000) expected, got String(#2267210740)

你需要使用某种关系字段,比如下拉菜单或其他方式来选择已经存在的账户之一。

有很多好的例子可以参考,这可能会对你有所帮助:http://railscasts.com/episodes/102-auto-complete-association-revised


嗨,该表单的代码是使用脚手架生成的:<div class="field"> <%= f.label :account %><br /> <%= f.text_field :account %> </div>,可以看到它是一个文本框。但是当点击“新发票”链接时,应将帐户ID传递给哪种类型的字段?显然,在这种情况下,用户不想在刚访问过帐户页面并单击“新发票”后使用下拉菜单或自动完成来选择帐户。 - Mark

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接