2016-04-16 17 views
-2

私はアップデートに問題があります。私がフォームを提出すると、パラメータは私に{"1"=>"1", "4"=>"1"}のような値のハッシュを与えます。値だけを更新したい。だから、私はキーと値を分離したkeys, values = @period.map { |k,v| [k.to_i, v.to_i] }.transposeここでは@period = {"1"=>"1", "4"=>"1"}です。私は[1,4]のような値を得る。では、この配列を使ってどのように更新できますか?私が最後の値(4)だけupdate_attributesを使用するとき。配列を使用してフィールドを更新するにはどうすればよいですか?私はレールが新しく、落ち着いてください。アレイ経由でアップデート

+0

どのように 'update_attributes'を使用していますか?そのコードを投稿してください。 – Pavan

+0

更新アクションでは、私は 'Period.where(subject_id::subject_id).update_all(subject_id:values)'を持っています。私は実行中にエラーは発生しませんが、問題は、値が変化していないということです。ログファイルには、 'SQL(1.3ms)UPDATE期間SET期間ject_id = NULL WHERE period.subject_id = NULL'と表示されます – Vikram

+2

コントローラメソッド全体、あなたのパラメータからのサンプルデータ、およびあなたが望むものを投稿できますか?すべてがうまくいけば起こる? –

答えて

0

あなたのアプローチは、Railsの規約に従わないため、難しいと感じています。 Railsのやり方は、あなたの人生をはるかに簡単にするでしょう。

TLDR:ネストされた属性を使用し、@institutionという親オブジェクトの周りにフォームを構築する必要があります。あなたは期間モデル、件名モデル、および機関のモデルを持っているように見えます

...より詳細にはhttp://guides.rubyonrails.org/form_helpers.html#building-complex-forms

:これを実装する方法についてのRailsガイドのこの部分を参照してください。期間は科目に属し、おそらく施設に属しているようです。私が間違っているなら、私を訂正してください。

次の方法で、Railsの規約に破壊されるように表示されます。

  1. あなたが編集方法やビューを使用する必要があるときには、showメソッドとビューを使用しています。

  2. form_forを使用できる場合は、form_tagを使用しています。

  3. ビューから直接モデルを呼び出しています。

  4. 親の複数の子レコードを処理する際にネストされた属性を使用していません。要約すると

、次の操作を行うためにあなたのアプローチを変更する必要があります。

  1. を一括であなたの期間のデータを更新する責任institutions_controller番号の更新方法を確認します。

  2. あなたの機関のモデルにこれを追加します。あなたのinstitutions_controllerで

    accepts_nested_attributes_for :periods 
    
  3. を、例えば、金融機関ののparamsに期間のためのparamsを追加します。

    params.require(:institution).permit(
        :name, 
        # whatever else is there now... 
        periods_attributes: [ 
         :id, 
         :subject_id, 
         :institution_id 
        ] 
    ) 
    
  4. あなた機関/ _formを更新次のように表示されます。

    <%= form_for @institution do |f| %> 
        <%= f.text_field :name %> 
        <%= fields_for :periods do |p| %> 
        <%= p.hidden_field :institution_id %> 
        <%= p.collection_select :subject_id, @subjects, :id, :name, prompt: true %> 
        <% end %> 
        <%= f.submit %> 
    <% end %> 
    

    どれくらいエレガントなのか見てみましょうか?すべての属性の名前が正しく指定されているため、送信時に受信パラメータを検査するときにキーと値が何を意味するのかを推測する必要はありません。

  5. 更新このような何かにあなたのinstitutions_controller#編集方法:

    def edit 
        @institution = Institution.includes(:periods).find(params[:id]) 
        @subjects = @institution.subjects.all # assumes subjects belong to institution 
    end 
    
  6. あなたinstitutions_controller番号の更新は任意の更新を必要としないことがあり、このようなものになります。

    def update 
        @institution = Institution.find(params[:id]) 
        if @institution.update_attributes(institution_params) 
        flash[:success] = "Saved!" 
        redirect_to @institution # or wherever you want to go 
        else 
        @subjects = @institution.subjects.all 
        render :edit 
        end 
    end 
    

これを試してください。 HTH

関連する問題