QA@IT

Rails3.2において、必要なすべての項目を入力させずにあらかじめデフォルト値などを設定することでの新規作成を実現させたいのですが、viewにおいてどのように書けばよろしいでしょうか?

2076 PV

tweetsモデルが、

t.integer "user_id", :null => false
t.text "context", :null => false
t.integer "question_id", :null => false
t.datetime "created_at", :null => false
t.datetime "updated_at", :null => false

のような構成となっている場合、
user_idは、Controller#createでtweets.user_id = current_userのように設定しているので、問題ないのですが、
:context および、:category_idは@tweet.saveにおいて必須となってます。

Tweets#newで全項目入力させる新規作成専用のviewは作っているのですが、
それ以外に、
Home#indexのような別の画面から、簡易tweetのようなかたちでの投稿を実現させたいと思っています。

この際、category_idなどは入力させず、自動的に、:caregory_id = 10 のような形で、パラメータを渡し、formには、:context用のtextareaのみで、postさせたいと思っています。

viewにおいて、どのように記述すれば実現できるかわかりません。どのように書けばよろしいのでしょうか?

回答

ただしく要件を理解できてるか微妙ですが、もし「同じロジックを使いつつ、Home#indexからの投稿の場合だけcaregory_id = 10をセットしたい」であれば、Home#indexのビューにだけhidden_field_tag :from_home, trueなんかを仕込んでおいて、TweetsControllerのほうでは

def create
  Tweet.create(params[:tweet]) do |t|
    t.caregory_id = 10 if params[:from_home]
  end
end

とでもしてやれば、共通のTweetsController#createを使って処理することができると思います。

編集 履歴 (0)
  • 説明足らずで申し訳ありませんでした。hidden_fieldで入れてあげればできるのですね。
    form_for @question do |f|
    f.text_area :context
    f.hidden_field :category_id, {:value => 10}
    end
    のようなかたちでもできることに気付きました。
    ありがとうございました。
    -
  • hidden_fieldにcategory_id=10を直接入れてしまうのだと、簡単にユーザが改ざんした任意の値を送れてしまうので、そこだけリスクの存在を意識しておきましょうね。あるいは、cookies.signed[:category_id] = 10で署名つきセッションクッキーで入れて改ざんできなくするという方法もあります。 -
ウォッチ

この質問への回答やコメントをメールでお知らせします。