0

Railsは初めてで、product_controller.rbに機能があります

def detach
  @product.photo = nil
  @product.save
end

ビュー ファイル show.html.erb からこのメソッドを呼び出して、メソッドが実行されるようにします。どうやってするの ?7 つのメソッドが .find(params[id]) を介して呼び出されることがわかりますが、それも明確ではありません。

4

3 に答える 3

2

次のようなルートを追加する必要がありますroutes.rb

resources :products do
  member do
    get 'detach' # /products/:id/detach
  end
end

それはあなたdetach_product_path(@product)があなたの見解で使うことができるあなたを与えるでしょう。おそらく、detachメソッドでリダイレクトも必要になるでしょう。

def detach
  @product = Product.find(params[:id])
  @product.photo = nil

  if @product.save
    redirect_to @product, notice: 'Photo was detached!'
  end
end
于 2013-03-08T10:41:09.717 に答える
1

サイモンの答えを修正しました。ただし、次のパスで製品を渡していないため、まだ問題に直面しています。

<%= link_to 'detach_image', detach_product_path %>

製品をアクションに渡す必要があります。

<%= link_to 'detach_image', detach_product_path(@product) %>

そうしProduct.find(params[:id])ないと、 は製品を見つけられず、@productは空になります...

編集して質問に回答してください:

1 -コントローラー内product_detach_pathのアクションのヘルパーです。もあり、同じことを行いますが、現在のホスト、ポート、およびパスのプレフィックスも含まれます。詳細はこちら。 ただし、パラメータを渡さないため、製品を見つけることができません。このため、検索しようとしている製品を指定する必要があります。アクションで定義されているため、ビューで使用できますが、他の製品を.... おそらく最初のものに送信できます。detachproductproduct_detach_url
Product.find(params[:id])@productshowdetach actionproduct_detach_path(Product.first)

2 - index、new、create、show、edit、update、destroyの7 つのデフォルト ルートresources :productsを生成します。 さらにルートを追加するには、またはを使用できます。基本的に、製品 (products/1/detach)へのルートを追加しますが、index (products/detach) などのコントローラーへのルートを追加します。詳細はこちら
membercollectionmembercollection

それが役立つことを願っています...

于 2013-03-08T11:43:34.587 に答える
1

以下のように変更してみてください

<%= link_to 'detach_image', product_detach_path(@product) %>

guides.rubyonrails.org/routing.html をご覧になることをお勧めします。

あなたは次のようにすることができます、

あなたはマッチを使うことができます

match '/update_profile', :to => 'users#update_profile'

また

resources :users do
  get 'update_profile', on: :member
end

そして、あなたは間違いなくユーザーコントローラーにメソッドを持っているでしょう

def update_profile
  @user = User.find(params[:id])

  if @user.save
    redirect_to @user, notice: 'user updated successfully!'
  end
end
于 2013-03-08T11:24:04.160 に答える