【问题标题】:How do I set a param in a controller action via a partial parameter?如何通过部分参数在控制器操作中设置参数?
【发布时间】:2013-09-07 16:33:37
【问题描述】:

专家,

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

这些都是模型:

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

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

感谢您的建议:)

【问题讨论】:

    标签: ruby-on-rails


    【解决方案1】:

    既然你的Objective 已经是belongs_to :category 那么目标模型有一个category_id,请尝试从

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

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

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

    【讨论】:

    • 我就知道会这么简单 :) 解决方案完美,谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-01-22
    • 1970-01-01
    • 2023-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-05
    相关资源
    最近更新 更多