質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Ruby on Rails 4

Ruby on Rails4はRubyによって書かれたオープンソースのウェブフレームワークです。 Ruby on Railsは「設定より規約」の原則に従っており、効率的に作業を行うために再開発を行う必要をなくしてくれます。

Ajax

Ajaxとは、Webブラウザ内で搭載されているJavaScriptのHTTP通信機能を使って非同期通信を利用し、インターフェイスの構築などを行う技術の総称です。XMLドキュメントを指定したURLから読み込み、画面描画やユーザの操作などと並行してサーバと非同期に通信するWebアプリケーションを実現することができます。

Q&A

解決済

1回答

1644閲覧

【初心者質問】ajaxでnewして、そのままeditに飛ばしたい

MaShiRo_H

総合スコア328

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Ruby on Rails 4

Ruby on Rails4はRubyによって書かれたオープンソースのウェブフレームワークです。 Ruby on Railsは「設定より規約」の原則に従っており、効率的に作業を行うために再開発を行う必要をなくしてくれます。

Ajax

Ajaxとは、Webブラウザ内で搭載されているJavaScriptのHTTP通信機能を使って非同期通信を利用し、インターフェイスの構築などを行う技術の総称です。XMLドキュメントを指定したURLから読み込み、画面描画やユーザの操作などと並行してサーバと非同期に通信するWebアプリケーションを実現することができます。

0グッド

0クリップ

投稿2016/07/11 10:01

こんにちは。
いつもお世話になっていますm(_ _)m

今、サイト製作中で
ajaxで追加(new)したコンテンツからそのままeditに飛ばしたいのですが、
_new.html.erb内で@user.idと記述するとidがnilのためエラーが出てしまいます。
そもそも@user.idの記述を外したところで、追加はされてもリロードすると保存がかかっていないのか、真っ白な状態になってしまいます。。

newと同時にidを生成(newと同時に保存?)する方法についてどなたかご教授いただけないでしょうか><
よろしくお願いいたしますm(_ _)m

users_controller.rb

ruby

1 def new 2 @user=User.new() 3 if @user.save 4 respond_to do |format| 5 format.js 6 end 7 end 8 end

new.js.erb

javascript

1$(('.ajax_new' ) ).append('<%= j(render('/users/new')) %>');

_new.html.erb

HTML

1<%= link_to 'Edit', edit_user_path(@user) %>

普段ビュー側をメインに触っているので、new/create辺りの流れに関してはあまり詳しくありません;
根本的に誤っていることがありましたらその点についてもご指摘いただけると嬉しいです!

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

全体の流れをまだよく理解できていないように見受けられます。
基本的に、オブジェクトのCRUD処理の順序としては、以下のような流れが一般的だと思います。
1.new
オブジェクトを新規作成(new)して、中身が空で、未保存のオブジェクトをnewのviewに渡します。
newのViewでは、パラメータを入力させるフォームがあり、そのパラメータを次の段階のcreateに渡します。
2.create
newのフォームで渡されたパラメータを、新たにnewしたオブジェクトに格納し、保存します。
一般的に、保存に成功した場合はshowにリダイレクトされ、失敗した場合は間違った値が格納されたオブジェクトを利用してnewのviewを表示し、訂正を促します
3.show
保存済みのオブジェクトを表示するviewです。
オブジェクトを特定するためのパラメータ(ID)を元に、オブジェクトをfindし、viewに渡します。
多くの場合、このviewからeditやdestroyに飛ばします。
4.edit
オブジェクトを特定するためのパラメータ(ID)を元に、オブジェクトをfindし、viewに渡します。
editのviewでは、保存済みのパラメータが格納された状態でフォームを表示し、変更された値をupdateに渡します。
5.update
editのフォームで渡された値を元に、オブジェクトをfinidし、パラメータを格納します。
たいていの場合、保存に成功した場合はshowにリダイレクトされ、失敗した場合は、失敗した場合は間違った値が格納されたオブジェクトを利用してeditのviewを表示し、訂正を促します
6.destroy
オブジェクトを特定するためのパラメータ(ID)を元に、オブジェクトをfindし、そのオブジェクトをデータベースから削除します。
削除に成功した場合、多くはindexにリダイレクトします。
7.index
以前のバージョンではlistアクションを利用していましたが、現在はindexが推奨のようです。対象となるモデルクラスの一覧を表示します。

上記の流れは、通常のページ遷移の流れですが、Ajaxを利用してもそれは基本的に変わりません。
また、newのviewに当たるフォームを別のアクションのViewで表示していれば、そのままCreateに飛ばす事なども可能なので、いくらでも好きなようにカスタマイズして構いません。(機能としてどのアクションでどの操作をしているかをきちんと把握する必要がありますが)

で、話を戻して問題となっている部分ですが、
原則として、createしていない(一度もsaveしていない)オブジェクトにはIDが存在しないため、show,edit,update,destroyを呼び出す事は出来ません。
ですから、newのviewからeditに飛ばそうとしても、IDがそもそも存在していない(というか、DB上にオブジェクトが存在していない)状態なので、飛ばしようがありません。

Ajaxでは、画面遷移がない分、処理の流れがわかりにくくなりますが、上記の原則は変わらないので、その部分を意識して、どのステップで何をするべきか考えて進められると良いかと思います。

投稿2016/07/11 16:37

rifuch

総合スコア1901

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

MaShiRo_H

2016/07/12 00:37

ご丁寧な回答ありがとうございます! 確かに曖昧になっている部分は多かったので、とても助かります>< 上記踏まえた上で質問させていただきたいのですが、 やはりnewとcreateを同時に...というのは不可能なんでしょうか?
rifuch

2016/07/12 03:03

もしかして、コントローラのnew,createとモデルのnew,createがごっちゃになったりしてませんか? コントローラのnewアクションの中でモデルをnewして、コントローラのcreateアクションの中でモデルをnewしてsaveする、という事なんですが・・・ ControllerとModelとViewそれぞれの関係について、一度整理されると良いかと思います。 また、基本の基本として、webアプリケーションでは、例に示した1〜7の事は全て独立して行われます。 それぞれのアクション(コントローラのメソッド)は、特定の条件さえ満たされていれば、どの順序であっても成功します。 たとえば、createアクションでは、新しく作りたいモデルの中身(attributes)に対応したデータ(params)が与えられている必要があります。 逆に言うと、それさえ正しくview側から送ってあげれば、いきなりcreateアクションを読んだとしても、全く問題はないです。 たとえば、indexの中に、remoteオプション付きのフォームを配置して、そこからAjaxでcreateアクションを呼んで、createアクションが成功したら、indexのviewの一覧に、javascriptで新規作成されたものを追加、フォームをクリアする、なんてことも出来ます。
MaShiRo_H

2016/07/12 12:16

まさにおっしゃる通りのようです>< もう一度整理して、曖昧なまま実装しないよう挑みたいと思います! rifuchさんのコメントにもいくつかヒントがあるような気がするので、頑張ります!! ありがとうございます!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問