专家
我正在构建一个小应用程序,它将目标分类。在类别索引页面上,我不想显示一个表单来添加直接属于该类别的新目标。在其他页面的表单中,可能存在该类别的选择器。
这些都是模型:
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设置为新对象,当前代码不起作用。我该怎么做?我觉得这不是“The Rails Way”。我已经阅读了几本教程和书籍,但我无法弄清楚应该如何做。有没有办法让category_id直接进入“目标”-hash?
我认为我不能在这里使用嵌套资源,而我也不想在类别页面之外创建目标。
感谢您的建议:)
答案 0 :(得分:0)
由于您的Objective
已经belongs_to :category
,因此目标模型有category_id
,请尝试更改您的观点
<%= hidden_field_tag :category_id, :value => category %>
到
<%= f.hidden_field :category_id, :value => category %>
这样你的目标&#34;哈希里面应该有category_id
,试一试。