0

专家,

我正在构建一个小应用程序,它将目标分类。在类别索引页面上,我不想显示一个表单来添加直接属于该类别的新目标。在其他页面的表单中,可能有一个类别选择器。

这些都是模型:

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 直接进入“目标”哈希?

我认为我不能在这里使用嵌套资源,同时我也不想在类别页面之外创建目标。

谢谢你的建议 :)

4

1 回答 1

0

既然你Objective已经belongs_to :category那么 Objective 模型有一个category_id,尝试改变你的观点

<%= hidden_field_tag :category_id, :value => category %>

<%= f.hidden_field :category_id, :value => category %>

这样你的“目标”哈希应该在category_id里面,试一试。

于 2013-09-07T22:23:30.230 回答