专家,
我正在构建一个小应用程序,它将目标分类。在类别索引页面上,我不想显示一个表单来添加直接属于该类别的新目标。在其他页面的表单中,可能有一个类别选择器。
这些都是模型:
class Category < ActiveRecord::Base
belongs_to :user
has_many :objectives
...
class Objective < ActiveRecord::Base
attr_accessible :category_id, :description, :title
belongs_to :user
belongs_to :category
...
在这里,我将 category_id 传递到表单中:
<%= render partial: "shared/objective_cat_form", locals: {category: category.id} %>
这是为每个类别显示的表单:
<%= form_for(@new_objective) do |f| %>
<%= render 'shared/error_messages', object: @new_objective %>
<div class="field">
<%= f.text_field :title, placeholder: "Add new objective..." %>
<%= hidden_field_tag :category_id, :value => category %>
<%= f.submit "New Objective", class: "btn btn-large btn-primary" %>
</div>
<% end %>
最后,这是创建新目标的控制器:
class ObjectivesController < ApplicationController
def create
Rails.logger.debug params.inspect
@objective = current_user.objectives.build(params[:objective])
if params[:category_id] != nil
@objective.category_id = params[:category_id]
end
if @objective.save
flash[:success] = "Objective added"
else
flash[:success] = "Error"
end
redirect_to categories_path
end
...
这是传递给控制器的哈希:
{"utf8"=>"✓", "authenticity_token"=>"szGt358HWs2XZ4tss2M6cetx68axJB2Vq6dzHU608Dw=",
"objective"=>{"title"=>"Fancy title"}, "category_id"=>"{:value=>42}", "commit"=>"New
Objective", "action"=>"create", "controller"=>"objectives"}
在控制器中,我需要另一种方法将 category_id 设置为新对象,当前代码不起作用。我该怎么做?我不觉得这是“Rails Way”。我已经阅读了几本教程和书籍,但我不知道该怎么做。有没有办法让 category_id 直接进入“目标”哈希?
我认为我不能在这里使用嵌套资源,同时我也不想在类别页面之外创建目标。
谢谢你的建议 :)