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

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

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

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

Ruby on Rails 4

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

Q&A

解決済

1回答

2646閲覧

railsで複数のコントローラから1つのテーブル(モデル)にデータを保存したい

begenner

総合スコア79

Ruby on Rails

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

Ruby on Rails 4

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

0グッド

0クリップ

投稿2018/01/07 14:08

現在ECサイトを作成しています。
フラグをたてて管理したいのですが1つのcontrollerでdestroyアクションを実行してしまうと会社の住所登録と配送先の住所登録の両方が消えてしまいます。
そこでcontrollerを2つ作成し、それぞれの内容を1つのモデルに保存しようと考えましたが、うまくいきません。

###実現したいこと

  • 住所モデル(adress)は1つ
  • 会社の住所登録、編集用のcontroller(c_adresses_controller)
  • 配送先の住所登録、編集用のcontroller(s_adresses_controller)

として2つのcontrollerの内容を1つの住所モデルに保存したいのですがルーティングエラーが発生します。
原因がわかる方、解決方法がわかる方がいらっしゃいましたらよろしくお願いします。

###動作環境
OS:mac
Ruby:2.3.5
Ruby on Rails: 4.2.5

###エラー内容
イメージ説明
イメージ説明

###現状

  • deviseを利用している
  • Adress(住所)モデルを1つ作成している
  • controllerは2つ作成している(c_adress(会社住所) と s_adress(配送先住所))
  • form_forを利用している
  • 会社住所、配送先住所をフラグを使って判断する
  • 2つの controller と View の内容はほぼ同じ
  • 下記のコードの controller と View は会社住所(s_adress)関連のものです

###試したこと
下記のサイトを参考にしてみましたが同じエラーが発生しました

railsでコントローラに関連付けられているテーブルとは別のテーブルのデータを読み書きするにはどうすればいいんでしょうか?

###該当のソースコード(抜粋、devise関連は省略してあります)
config/routes.rb

ruby

1Rails.application.routes.draw do 2 3 #住所関連 4 resources :adresses, :only => [:index] 5 resources :c_adresses, :except => [:index, :show] 6 resources :s_adresses, :except => [:index, :show] 7 8 root to: 'tops#index' 9end

schema.rb

ruby

1ActiveRecord::Schema.define(version: 20180106142022) do 2 3 create_table "adresses", force: :cascade do |t| 4 t.integer "user_id", limit: 4 5 t.string "postal_code", limit: 255 6 t.string "city", limit: 255 7 t.integer "c_adress_flg", limit: 4 8 t.integer "s_adress_flg", limit: 4 9 t.datetime "created_at", null: false 10 t.datetime "updated_at", null: false 11 end 12 13end

app/controllers/s_adresses_controller.rb

ruby

1class SAdressesController < ApplicationController 2 #↓↓ここを参考サイトをもとに追記しましたがエラー内容は変わりませんでした。 3 model :adress 4 5 def new 6 @adress = Adress.new 7 @submit = "登録する" 8 end 9 10 def create 11 @adress = Adress.new(adress_params) 12 13 if @adress.save 14 # redirect_to adresses_url(id: current_user.id) 15 redirect_to adresses_path 16 else 17 render 'new' 18 end 19 end 20 21 private 22 def adress_params 23 params.require(:adress).permit(:user_id, :postal_code, :city, :street, :others, :c_adress_flg, :s_adress_flg) 24 end 25 26end

app/views/s_adresses/new.html.erb

ruby

1<%= form_for(@adress) do |f|%> 2 3<!-- 郵便番号 --> 4 <div class="field"> 5 <%= f.label :postal_code, '郵便番号' %> 6 <%= f.text_field :postal_code, autofocus: true %> 7 </div> 8<!--市区町村--> 9 <div class="field"> 10 <%= f.label :city, '市区町村'%> 11 <%= f.text_field :city, autofocus: true %> 12 </div> 13 14 <!-- 通常配送先の可否 --> 15 <div class="field"> 16 <%= f.check_box :s_adress_flg,{}, 2, 1 %><%= f.label :s_adress_flg, '通常配送先にする'%> 17 </div> 18 19 <%= f.hidden_field :user_id, value: current_user.id %> 20 <%= f.hidden_field :c_adress_flg, :value => 0 %> 21 22 <div class="actions"> 23 <%= f.submit @submit %> 24 </div> 25<% end %>

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

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

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

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

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

guest

回答1

0

ベストアンサー

こんにちは。

まず前提の確認として、routes.rb

ruby

1resources :adresses, :only => [:index]

とあるので、adressコントローラ(class AdressesController < ApplicationController)
も作るものと思えました。
その上で、エラーメッセージには

No route matches [POST] "/adresses"

とあり、このエラーが出ないようにしたいということは、住所の新規作成は、
POST /adresses によって、会社住所と配送先住所のどちらも
作成できるようにしたいという趣旨だと思えますが、それでよいでしょうか?

もし、それであれば、routes.rb

ruby

1resources :adresses, :only => [:index]

としているところを、:createも追加して

ruby

1resources :adresses, :only => [:index, :create]

とすればよいと思います。

こうすれば、POST /adresses が、adresses#create にルーティングされます。

ただ、この場合は、
POST /c_adresses

POST /s_adresses
は不要かもしれません。

もし、会社住所の新規作成は、POST /c_adresses で行い、
配送先住所の新規作成は、POST /s_adresses で行う
ということであれば、POST /adresses は用意する必要は
ないので、

No route matches [POST] "/adresses"

というエラーになっても妥当といえます。

以上参考になれば幸いです。

投稿2018/01/07 15:12

編集2018/01/07 15:26
jun68ykt

総合スコア9058

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問