質問編集履歴

2 問題箇所をフォーカス

t1gerkngd0m

t1gerkngd0m score 17

2019/02/16 14:26  投稿

ボタンに値を持たせて送信するとトップページへ遷移してしまう
form_forからformタグが生成されず、ボタン押下時に期待した遷移をしてくれない
**困っていること**
---
フリマアプリを作成しており、ボタンを押すだけで商品の出品・停止の変化を実現させたいです。
しかし、ボタンを押した後コントローラーへ処理が飛んでおらず、そのままトップページが表示されます。
この点について、正しい挙動を示すためにはどうすれば良いかご教授頂きたいです。
form_forから生成されるHTMLを検証したところ、formタグが生成されず、inputタグしか生成されておりませんでした。
恐らくそれが原因だと思いますので、記述で間違っている箇所があればご指摘頂きたいです。
**View**
---
```haml
= form_for @product, url: {action: :previewChange} do |f|
= form_for( @product, url: {action: :previewChange}, html: {method: :patch}) do |f|
 - if @product.status == "出品中"
   = f.hidden_field :status, value: 3
   = f.button "出品を一旦停止する", type: "submit", class: "btn-default btn-gray"
   = f.submit "出品を一旦停止する", class: "btn-default btn-gray"
 - else @product.status == "公開停止中"
   = f.hidden_field :status, value: 0
   = f.button "出品を再開する", type: "submit", class: "btn-default btn-red"
```
**Controller**
---
```ruby
def preview
 @item_images = @product.item_images
end
 before_action :set_product, only: [:preview, :previewChange]
 def preview
   @item_images = @product.item_images
 end
def previewChange
 product = Product.new(status_params)
 if product.update(status_params)
   render :preview
 else
   render :preview
 def previewChange
   binding.pry
   @product.update(status_params)
   if product.update(status_params)
     render :preview
   else
     render :preview
   end
 end
end
 private
 def set_product
   @product = Product.find(params[:id])
 end
private
def status_params
 params.require(:product).permit(
   :status
 )
end
 def status_params
   params.require(:product).permit(
     :status
   )
 end
```
**Routes**
---
```ruby
root to:'products#index'
resources :products do
 member do
   get :preview, to: 'products#preview', as: 'preview'
   patch :preview, to: 'products#previewChange'
   patch :preview, to: 'products#previewChange', as: 'previewChange'
 end
end
```
**起きていること**
**生成されるHTML**
---
viewから飛ばした値をpreviewChangeで受け取りたいのに、トップページへ遷移してしまっています。
恐らくパスの設定がうまくいっていないからだと思いますが、どのように設定するのが正しいのか不明なままです。
どうぞよろしくお願いいたします。
<input type="hidden" name="_method" value="patch">
<input name="utf8" type="hidden" value="✓">
<input type="hidden" name="authenticity_token" value="xBqknEQpIVhamvQiSpasB+k2BxisQPK2qzRVsLuNit5LTn1i1Y9f+stjsA+q9CgoVdwG8Rndeyegtj+kG3QuPg==">
<input value="3" type="hidden" name="product[status]" id="product_status">
<input type="submit" name="commit" value="出品を一旦停止する" class="btn-default btn-gray" data-disable-with="出品を一旦停止する">
  • Ruby

    9912 questions

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

  • Ruby on Rails

    9324 questions

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

1 文脈の修正

t1gerkngd0m

t1gerkngd0m score 17

2019/02/16 11:01  投稿

ボタンに値を持たせて送信するとトップページへ遷移してしまう
**困っていること**
---
しかし、ボタンを押した後コントローラーへ処理が飛んでおらず、そのままトップページが表示されます。
この点について、正しい挙動を示すためにはどうすれば良いかご教授頂きたいです。
**View**
---
```haml
= form_for @product, url: {action: :previewChange} do |f|
 - if @product.status == "出品中"
   = f.hidden_field :status, value: 3
   = f.button "出品を一旦停止する", type: "submit", class: "btn-default btn-gray"
 - else @product.status == "公開停止中"
   = f.hidden_field :status, value: 0
   = f.button "出品を再開する", type: "submit", class: "btn-default btn-red"
```
**Controller**
---
```ruby
def preview
 @item_images = @product.item_images
end
def previewChange
 product = Product.new(status_params)
 if product.update(status_params)
   render :preview
 else
   render :preview
 end
end
private
def status_params
 params.require(:product).permit(
   :status
 )
end
```
**Routes**
---
```ruby
root to:'products#index'
resources :products do
 member do
   get :preview, to: 'products#preview', as: 'preview'
   patch :preview, to: 'products#previewChange'
 end
end
```
**起きていること**
---
viewから飛ばした値をpreviewChangeで受け取りたいのに、トップページへ遷移してしまっています。
恐らくパスの設定がうまくいっていないからだと思いますが、どのように設定するのが正しいのか不明なままです。
どうぞよろしくお願いいたします。
  • Ruby

    9912 questions

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

  • Ruby on Rails

    9324 questions

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

思考するエンジニアのためのQ&Aサイト「teratail」について詳しく知る