Rails参数[:id]尚未发送

时间:2014-12-08 23:07:02

标签: ruby-on-rails ruby-on-rails-4 routes params

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。

为什么?

在我的其他模特机会中,有类似的行为,一切都很好。

1 个答案:

答案 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;您的用户的功能。做一些草图,并询问您的客户/几内亚猪用户对他们看起来更直观。