専門家、
目標をカテゴリに整理する小さなアプリを作成しています。カテゴリのインデックス ページで、カテゴリに直接属する新しい目標を追加するフォームを表示したくありません。他のページのフォームには、カテゴリのセレクターがある場合があります。
これらは両方ともモデルです:
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 を「目的の」ハッシュに直接取得する方法はありますか?
ここではネストされたリソースを使用できないと思いますが、カテゴリ ページの外に目的を作成したくありません。
アドバイスをありがとう :)