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 を新しいオブジェクトに設定する別の方法が必要です。現在のコードは機能しません。どうすればいいですか?これが「The Rails Way」だとは思いません。いくつかのチュートリアルや本を読みましたが、これをどのように行うべきかわかりませんでした。category_id を「目的の」ハッシュに直接取得する方法はありますか?

ここではネストされたリソースを使用できないと思いますが、カテゴリ ページの外に目的を作成したくありません。

アドバイスをありがとう :)

4

1 に答える 1

0

Objectiveすでにbelongs_to :categoryObjectiveモデルには があるのでcategory_id、ビューをから変更してみてください

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

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

category_idこのようにして、「目的の」ハッシュが内部にあるはずです。試してみてください。

于 2013-09-07T22:23:30.230 に答える