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

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

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

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Active Record

Active Recordは、一つのオブジェクトに対しドメインのロジックとストレージの抽象性を結合するデザインパターンです。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

Q&A

2回答

1591閲覧

RubyのActiveRecordでの更新方法について(初心者)

gonu

総合スコア8

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Active Record

Active Recordは、一つのオブジェクトに対しドメインのロジックとストレージの抽象性を結合するデザインパターンです。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

0グッド

0クリップ

投稿2015/07/18 14:45

現在データベースの更新機能を作成しています.
テーブルのサイズを動的に変化させ,更新ボタンを押下したいと思っています.
テーブルの表記は下記のソースコードでうまく生成されていますが,
この方法だと全てのデータベースが更新されてしまいます.
入力されたレコードだけ更新するにはどうすればよいか,ご教授ください.

index.erbの中にあるテーブル文内でfor文を回し,テーブルサイズをデータベースのサイズに合わせています.テーブルに更新ボタンを作成しているのですが,うまくいきません

lang

1 <% @samples.each do |sample| %> 2 <tr> 3 <form method="post" action="/update"> 4 <td><input type="text" name="title" value=<%= sample.title %>></td> 5 <td><input type="submit" name=<%= sample.id %> value="更新"></td> 6 </tr> 7 <% end %> 8 </form>

関連するrbファイルには

lang

1post '/update' do 2 Sample.update_all({title: params[:title]}) 3 redirect '/' 4end

のような記載をしています.
分かる方がいましたら,よろしくお願いします.

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

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

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

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

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

rifuch

2015/07/18 16:26

関連する.rbファイルって、コントローラですか?
gonu

2015/07/19 00:52

indexとヒモ付をしている部分でどちらかというとモデルだと思っています
guest

回答2

0

RubyのActiveRecordだけを使っているのであれば、hamunofuneさんので正解です。
(Viewの方で表示するための@sampleの取得はしていないようですが)

ただし、乗せているサンプルコードを見る限り、Rubyではなく、RubyOnRailsを利用されているのだと思います。

Railsだと仮定するなら以下の様な構成になるかと。

Ruby

1 2# app/controllers/hoge_controller.rb(コントローラ) 3 4class HogeController < ApplicationController 5 6 def index 7 @sample = Sample.all 8 end 9 10 def update 11 # この時点でパラメータは以下の様な感じで入ってくる 12 # {id: 1, sample: {title: "hoge"}} パラメータはparamsでアクセスできる 13 if Sample.update(params[:id], params[:sample]) 14 flash[:success] = "sample is updated" 15 else 16 flash[:error] = "sample update failed" 17 end 18 redirect_to action: :index 19 end 20 21 # 新規作成、削除、等々のメソッド(アクション) 22end 23

Ruby

1# app/models/sample.rb(モデル) 2 3class Sample < ActiveRecord::Base 4 attr_accessible :title 5end 6

html

1<!-- app/views/sample/index.html.erb(ビュー) --> 2 3<table> 4 <% @samples.each do |sample| %> 5 <% @sample = sample %><!-- ここはあんまり行儀が良くないですが ---> 6 <tr> 7 <%= form_tag sample_path(@sample), method: :put do %> 8 <td><%= text_field :sample, :title %></td> 9 <td><%= submit_tag "更新" %></td> 10 <!-- ここのフォームで送られるパラメータはsample.id = 1, sample.title = "hoge"として --> 11 <!-- {id: 1, sample: {title: "hoge"}} --> 12 <% end %> 13 </tr> 14 <% end %> 15</table> 16

Ruby

1# config/routes.rb 2 3 resource :sample 4 root to: "sample#index"

基本的に、Railsの考え方だと、Viewから渡ってきたパラメータをいじり回してDBに格納するためのものをModelに渡すのはControllerの役割です。
ModelがDBに格納するための仕組みは、ActiveRecordに組み込まれているので、ControllerでModelのパラメータを更新して、Modelのsaveを呼びます。
Model側では、アトミックな処理をしたいとき等にメソッドをオーバーライドするとかの処理を書くのが一般的でしょう。

投稿2015/07/19 02:53

rifuch

総合スコア1901

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

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

0

おはようございます

生成されるクエリは以下の通りです
Sample.update_all({title: params[:title]})
→ UPDATE SAMPLE SET TITLE = params[:title]の値

これだとSAMPLEのTITLEを全てparams[:title]の値にする命令なので
指定行のみ更新するとなるとクエリは次の通りです

UPDATE SAMPLE SET TITLE = params[:title]の値 WHERE ID = 指定行のID

ActiveRecordでこのように条件指定して更新するなら次のように指定できると思います

Sample.update_all({title: params[:title]}, "id = " + sample.id)

投稿2015/07/19 01:12

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問