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

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

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

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Q&A

解決済

1回答

3925閲覧

Railsでedit機能をつけたいのですがDBに追加されてしまう

退会済みユーザー

退会済みユーザー

総合スコア0

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

1グッド

1クリップ

投稿2016/12/04 12:48

タイトル通りの内容なのですが、DBに保存したデータを編集してボタンを押すと編集されずにDBに新しく追加されてしまいます
どうすればいいのでしょうか?
正しいコードを教えてほしいです
routes

Rails.application.routes.draw do resources :tweets root 'tweets#index' end

tweets_controler

class TweetsController < ApplicationController def index @tweets = Tweet.all end def new end def show @tweet = Tweet.find_by(:id => params[:id]) end def create @tweet = Tweet.new @tweet.day = params[:tweet][:day] @tweet.title = params[:tweet][:title] @tweet.about = params[:tweet][:about] if @tweet.save redirect_to tweets_path else render 'new' end end def edit @tweet = Tweet.find_by(:id => params[:id]) end def update @tweet = Tweet.find_by(:id => params[:id]) if @tweet.update(:id => params[:id]) redirect_to tweets_path else render 'edit' end end def destroy @tweet = Tweet.find_by(:id => params[:id]) @tweet.destroy redirect_to tweets_path end end

index

<div class="container"> <% @tweets.each do |tweet| %> <h2><%= tweet.day %></h2> <h1><%= tweet.title %></h1> <%= link_to '[Show]', tweet %> <%= link_to "[Delete]", tweet_path(tweet.id), method: :delete, data: { confirm: "are you sure?" } %><br> <hr> <% end %> <%= link_to "投稿する", '/tweets/new', class: "btn btn-primary" %> </div>

new

<div class="container"> <% require "date" %> <% now = (Date.today).jisx0301 %> <div class="form-horizontal"> <%= form_for Tweet.new do |f| %> <%= f.label :day, "日付を入力" %><br> <%= f.text_field :day, value: now, :class => "form-control" %><br> <%= f.label :title, "タイトルを入力" %><br> <%= f.text_field :title, :class => "form-control" %><br> <%= f.label :about, "内容を入力" %><br> <%= f.text_area :about, :class => "form-control" %><br> <%= f.submit "投稿", :class => "btn btn-primary" %> <%= link_to "Home", tweets_path, class: "btn btn-primary" %> <% end %> </div> </div>

show

<div class="container"> <h1><%= @tweet.title %></h1> <h2><%= @tweet.about %></h2> <%= link_to "編集", edit_tweet_path(@tweet.id), class: "btn btn-primary" %> <%= link_to 'Back', tweets_path %> </div>

edit

<div class="container"> <% require "date" %> <% now = (Date.today).jisx0301 %> <div class="form-horizontal"> <%= form_for Tweet.new do |f| %> <%= f.label :day, "日付を入力" %><br> <%= f.text_field :day, value: now, :class => "form-control" %><br> <%= f.label :title, "タイトルを入力" %><br> <%= f.text_field :title,value: @tweet.title, :class => "form-control" %><br> <%= f.label :about, "内容を入力" %><br> <%= f.text_area :about, value: @tweet.about, :class => "form-control" %><br> <%= f.submit "編集", :class => "btn btn-primary" %> <%= link_to "Home", tweets_path, class: "btn btn-primary" %> <% end %> </div> </div>
chocolate24👍を押しています

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

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

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

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

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

guest

回答1

0

ベストアンサー

edit.html.reb内の
<%= form_for Tweet.new do |f| %>
のノードでTweetを新しく作っています。
Tweet.newを@tweetにすれば正しく動きます。

以下は良いコードを書くための参考です

controller内のnewを
def new
@tweet=Tweet.new
end
と置き換えれば
edit.html.rebと
new.html.rebを統合して
_form.html.erbに繰り出し

<div class="container"> <% require "date" %> <% now = (Date.today).jisx0301 %> <div class="form-horizontal"> <%= form_for @tweet do |f| %> <%= f.label :day, "日付を入力" %><br> <%= f.text_field :day, value: now, :class => "form-control" %><br>
<%= f.label :title, "タイトルを入力" %><br> <%= f.text_field :title,value: @tweet.title, :class => "form-control" %><br> <%= f.label :about, "内容を入力" %><br> <%= f.text_area :about, value: @tweet.about, :class => "form-control" %><br> <%= f.submit nil, :class => "btn btn-primary" %> <%= link_to "Home", tweets_path, class: "btn btn-primary" %>

<% end %>

</div> </div> として edit.html.reb <% render 'form' %> new.html.reb <% render 'form' %> といった形にすると後々便利です。ボタン名を日本語にしたい場合 config/locals/ja.yml (なければ作成 に下記を追記してください。 ja: helpers: submit: create: "登録する" update: "更新する" submit: "保存する"

投稿2016/12/05 03:22

moke

総合スコア2241

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

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

退会済みユーザー

退会済みユーザー

2016/12/06 22:38

ご回答ありがとうございます。 ご回答だけではなくさらにはより向上できるようアドバイスまでいただき感謝です。 上記でご回答下さったように <%= form_for @tweet do |f| %> としてみたのですが編集されずに今までの投稿のままindexに戻ってしまいます・・・。 なぜなのでしょうか><
moke

2016/12/08 01:15

すみませんupdateも間違っていますね update でidしかUpdateされていません つまり何もしてない。 update(:id=>parms[:id])を update(:day=>params[:tweet][:day],:title=>params[:tweet][:title],:about=>params[:tweet][:about]) と置き換えてください controllerはそれで全てでしょうか railsは4.0.0より、StrongParametarという ものが追加されていてセキュリティのため permit以下のものしか変更を受け付けないように なっています。 private def tweet_params params.require(:tweet).permit(:id,:title,略) end として update(id: params[:id])を update(tweet_params)とかするのが レール(rails)に乗った人生です。 ちなみに今更ですが rails g scaffold tweet day:date title:string about:string で上記のことを全てやってくれます。 むしろそれがrails さらに rake db:mograte をやるとテーブル迄作ってくれます。 ただ、試行錯誤はエンジニアの必須スキルです。 rails g scaffold tweet day:date title:string about:string をタッターンとして自動生成されたものが動くのをみて 悦に入ってる人より、多くのものを学んだはずです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問