gpt4 book ai didi

ruby-on-rails - rails : Manipulating params before saving an update - wrong approach?

转载 作者:行者123 更新时间:2023-12-04 06:50:13 25 4
gpt4 key购买 nike

首先,我觉得我以错误的方式接近这个问题,但我不知道该怎么做。这也有点难以解释,所以请耐心等待。

我使用 Javascript 来允许用户在编辑表单中添加多个文本区域,但这些文本区域用于单独的模型。它基本上允许用户在两​​个模型而不是一个模型中编辑信息。以下是关系:

class Incident < ActiveRecord::Base
has_many :incident_notes
belongs_to :user
end

class IncidentNote < ActiveRecord::Base
belongs_to :incident
belongs_to :user
end

class User < ActiveRecord::Base
has_many :incidents
has_many :incident_notes
end

当用户添加“事件注释”时,它应该自动识别该特定用户的注释。我还希望多个用户能够为同一事件添加注释。

我遇到的问题是,当用户添加新的文本区域时,rails 无法确定新的 event_note 属于该用户。所以它最终创建了 event_note,但 user_id 为零。例如,在日志中,当我编辑表单并添加新注释时,我看到以下插入语句:
INSERT INTO "incident_notes" ("created_at", "updated_at", "user_id", "note", "incident_id") VALUES('2010-07-02 14:09:11', '2010-07-02 14:09:11', NULL, 'Another note', 8)
所以我决定尝试做的是在更新方法中操作 :incident 的参数。这样我就可以自己添加 user_id 了,但这看起来不像 Rails,但我不知道还有什么办法。

提交表单时,参数如下所示:
Parameters: {"commit"=>"Update", "action"=>"update", "_method"=>"put", "authenticity_token"=>"at/FBNxjq16Vrk8/iIscWn2IIdY1jtivzEQzSOn0I4k=", "id"=>"18", "customer_id"=>"4", "controller"=>"incidents", "incident"=>{"title"=>"agggh", "incident_status_id"=>"1", "incident_notes_attributes"=>{"1279033253229"=>{"_destroy"=>"", "note"=>"test"}, "0"=>{"id"=>"31", "_destroy"=>"", "note"=>"asdf"}}, "user_id"=>"2", "capc_id"=>"SDF01-071310-004"}}
所以我想我可以编辑这个部分:
"incident_notes_attributes"=>{"1279033253229"=>{"_destroy"=>"", "note"=>"test"}, "0"=>{"id"=>"31", "_destroy"=>"", "note"=>"another test"}}
如您所见,其中一个还没有 id,这意味着它将新插入到表中。

我想为新项目添加另一个属性,如下所示:
"incident_notes_attributes"=>{"1279033253229"=>{"_destroy"=>"", "note"=>"test", "user_id" => "2"}, "0"=>{"id"=>"31", "_destroy"=>"", "note"=>"another test"}}
但这又看起来不像 rails ,我不知道如何解决它。这是事件 Controller 的更新方法。
# PUT /incidents/1
# PUT /incidents/1.xml
def update
@incident = @customer.incidents.find(params[:id])

respond_to do |format|
if @incident.update_attributes(params[:incident])
# etc, etc
end

我想我可以添加如下内容:
params[:incident].incident_note_attributes.each do |inote_atts|
for att in inote_atts
if att.id == nil
att.user_id = current_user.id
end
end
end

但显然 incident_note_attributes不是方法。所以我不知道该怎么做。我怎么解决这个问题?

对不起,文字墙。任何帮助深表感谢!

最佳答案

我有一个类似的要求,这就是我解决它的方法:

class Incident < ActiveRecord::Base
has_many :incident_notes
belongs_to :user

attr_accessor :new_incident_note

before_save :append_incident_note

protected

def append_incident_note
self.incident_notes.build(:note => self.new_incident_note) if !self.new_incident_note.blank?
end
end

然后在表单中,您只需使用标准 rails form_for并使用 new_incident_note作为属性。

我选择这种方法是因为我知道它只是将数据放入笔记中并进行少量数据验证。如果您有深入的验证,那么我建议您使用 accepts_nested_attributes_forfields_for .这是有据可查的 here .

关于ruby-on-rails - rails : Manipulating params before saving an update - wrong approach?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3239213/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com