如何通过部分参数在控制器动作中设置参数?

时间:2013-09-07 16:33:37

标签: ruby-on-rails

专家

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

这些都是模型:

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?

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

感谢您的建议:)

1 个答案:

答案 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,试一试。