Rails 4
我有一个帐户和笔记模型。我正在尝试保存与该帐户相关的注释。
注意模型
class Note < ActiveRecord::Base
belongs_to :account
end
帐户模型
class Account < ActiveRecord::Base
...
has_mamy :notes
end
路线:
resources :accounts
resources :notes
get 'accounts/:id/new_note' => 'notes#new'
notes_controller.rb
def new
@note = Note.new
@note.account_id = params[:id]
respond_with(@note)
end
def create
@note = Note.new(note_params)
@note.save
repond_with(@note)
end
private
def note_params
params.require(:note).permit(:title, :description, :account_id, :opportunity_id, :created_by, :updated_by)
end
end
当我获取“... / accounts / 1 / new_note”并发布请求时,注释会被保存,但@ note.account_id = nil。
为什么?
在我的其他模特机会中,有类似的行为,一切都很好。
答案 0 :(得分:1)
您可以采取两种策略来处理这个问题。
选项1.最佳解决方案是使用嵌套属性。您的用户将拥有一个表单,该表单可用于在一次用户体验中为两个模型创建数据。有关详细信息,请查看RailsGuides。
在app / models / account.rb
中class Account < ActiveRecord::Base # as usual
has_many :notes
accepts_nested_attributes_for :notes
end
更新&#34; accounts_params&#34; app / controllers / accounts_controller.rb中的方法
private
def accounts_params
params.require(:accounts).permit(--all the stuff you already have--,
notes_attributes: [
:id,
:title,
:description,
:account_id,
:opportunity_id
])
end
同样在app / controllers / accounts_controller.rb中,您需要进行两次进一步的小改动 - &#34; new&#34;和&#34;编辑&#34;方法:
def new
@account = Account.new
@account.notes.build # adds an empty note to your new account.
end
def edit
@account = Account.find(params[:id])
@account.notes.build # add a new empty note
end
我假设您的项目中有一个views / accounts / _form.html.erb。假设您希望合并帐户和备注的用户界面,您可以扩展_form.html.erb文件以包含以下内容(例如,这可能在您的提交按钮之前):
<%=f.fields_for :notes do |note| %>
<div>
<%= note.label :title %>
<%= note.text_field :title %>
</div>
<div>
<%= note.label :description %>
<%= note.text_area :description, rows: 4 %>
</div>
<% end %>
然后您可以省去自定义路由设置和可能的notes_controller(除非您出于其他原因需要它)。
选项2.您可以拥有一个专门的notes_controller来处理创建和更新请求,您可以对其进行微调以将用户重定向回帐户页面。不是&#34;坏&#34;要走的路,但它的缺点是&#34;更多&#34;代码和用户可以遵循的第二个流程 - 管理帐户和单独管理笔记。那就是说,你可以做到这一点。
a)创建一个带有典型&#34;创建&#34;的notes_controller。和&#34;更新&#34;里面的方法。
b)在这些方法结束时,他们可能会这样做:
redirect_to @note
您可以将其更改为:
redirect_to @note.account
这会将你带到localhost:3000 / accounts / 123(假设该笔记附在第123号笔记上。
c)您可以将app / views / notes / _form.html.erb文件构建为自包含的表单。
d)在您的app / views / accounts / show.html.erb文件中,您将在页面底部添加一个新面板,其中列出了特定帐户的所有注释。
# app/views/accounts/show.html.haml
<h1>Account # <%= @account.id %></h1>
...
<p>
<=% link_to 'back', accounts_url %> | <%= link_to 'edit', edit_account_url(@account) %>
</p>
<h2>Notes</h2>
<table>
<tr>
<th>Title</th>
<th>Description</th>
</tr>
<% @account.notes.each do |note| %>
<tr>
<td><%= note.title %></td>
<td><%= note.description %></td>
</tr>
<% end %>
<%= form_for @account.notes.build do |f| %>
<tr>
<td><%= f.text_field :title %></td>
<td><%= f.text_area :description, rows: 4 %></td>
<!-- add whatever fields you want in here -->
</tr>
<tr><td colspan="4"><%= f.submit 'Save' %></td></tr>
<% end %>
</table>
为了完成这项工作,您在路线文件中需要的只有:
# config/routes.rb
resources :accounts # as before
resources :notes, only: [:create, :update]
rails应该处理剩下的事情。
使用任一选项,您可能想要摆弄一下以提供“编辑”功能。并且&#39;删除&#39;您的用户的功能。做一些草图,并询问您的客户/几内亚猪用户对他们看起来更直观。