2016-11-19 5 views
0

RedRedを使用するように自分のサイトを変換しました。そのため、JSON配列はActiveRecord配列ではなく自分のビューに送られます。 model.attributemodel['attribute']のような必要なコンバージョンをすべて達成しました。Rails:form_for with json:未定義のメソッドto_model for Hash

しかし、自分のform_forが機能することを理解できません。ユーザーはゲームの予測を行うことができます。同じ_form.html.erbを使用して、予測を作成または更新します。私が取得エラー、undefined method 'to_model' for #<Hash:0x007ff28d5f19c8>これらの行の両方で発生します

_form.html.erb 
<%= form_for [game, (prediction || Prediction.new)], remote: true do |f| %> 
... 
<%= link_to "Delete", [game, prediction], method: :delete, remote: true, class: 'btn btn-xs btn-danger' if prediction.present? %> 

任意のアイデア?あなたは以下読んで、より多くの情報が必要な場合:基本的には、フォームと部分負荷とgamepredictionに合格するだけでなく、predictionがすでに代わりに更新されるために存在するかどうかを判断

# index.html.erb 
@games.each do |game| 
... 
<%= prediction_form_link(@predictions, game) %> 
<%= render partial: 'predictions/form', locals: { game: game, prediction: prediction_for(@predictions, game) } %> 

をリンクし、部分的作成日:

def prediction_for(predictions, game) 
    predictions["#{game['id']}"].first if predictions["#{game['id']}"].present? 
end 
def prediction_form_link(predictions, game) 
    if prediction = prediction_for(predictions, game) 
... # code that displays what this button looks like. Partial is loaded in a modal. 

ありがとうございます。

答えて

0

さて、私は最終的にpryと古いSOの投稿に多くの時間を費やしてそれを理解しました。 JSONを渡しているので、form_forOpenStructに変更する必要があります。基本的に部分と私のjs.erbを修正しなければなりません。

# _form.html.erb 
form_for(OpenStruct.new(prediction || {}), as: :prediction, remote: true, url: (prediction ? game_prediction_path([game['id']], [prediction['id']]) : game_predictions_path(game['id'], Prediction.new)), method: (prediction ? :put : :post)) do |f| %> 
... 
<%= link_to "Delete", game_prediction_path([game['id']], [prediction['id']]), method: :delete, remote: true, class: 'btn btn-xs btn-danger' if prediction.present? %> 

OpenStruct新しいもののために既存のpredictionまたは{}をつかむのいずれかに。私はこれらのどれが絶対に必要であるかについてもわからないが、それは働いている。 :predictionとして分類し、2つの状況(#createまたは#update)でパス、パラメーター、およびメソッドを指定します。これは、両方に同じ部分を使用しているためです。

は、その後、私は少し戻っビューas_jsonにデータを送信するために私create.js.erbdestroy.js.erb、およびupdate.js.erbファイルを変更する必要がありました。

# create.js.erb for example 
$('#game-<%= @game.id %>').modal("hide"); 
$('.modal-backdrop').remove(); 
$('body').removeClass('modal-open'); 
$('#user-prediction-<%= @game.id %>').html('<%= j prediction_form_link(@predictions.as_json, @game.as_json) %>'); 
$('#user-prediction-<%= @game.id %>').append('<%= j render partial: "predictions/form", locals: { game: @game.as_json, prediction: prediction_for(@predictions.as_json, @game.as_json) } %>') 
関連する問題