0

私はRailsの初心者ですが、実際には明らかに「初心者の問題」に悩まされています。

「サウンド」足場コントローラーを手に入れたので、アクション「sendit」を追加する必要がありました。ビューからコントローラーへのサウンドにアクセスできません。

http://127.0.0.1:3000/sounds/sendit.14 」にアクセスしようとすると、これがエラーになります(なぜ、sendit.14 で、 sound/sendit/14 や sounds/14/sendit ではないのですか?)

ActiveRecord::RecordNotFound in SoundsController#sendit

Couldn't find Sound without an ID

Application Trace | Framework Trace | Full Trace
app/controllers/sounds_controller.rb:74:in `sendit'
Request

Parameters:

{"format"=>"14"}

これが私のコードです:

サウンドコントローラー:

def sendit
    @sound = Sound.find(params[:id]) # ----- Error is on this line -----
    # Do Job
  end


Index.html.erb

<% @sounds.each do |sound| %>
  <% if sound.user_id == current_user.id %>
    <tr>
      <td><%= sound.title %></td>
      <td><%= sound.user.email %></td>
      <td><%= link_to 'Show', sound %></td>
      <td><%= link_to 'Edit', edit_sound_path(sound) %></td>
      <td><%= link_to 'Destroy', sound, method: :delete, data: { confirm: 'Are you sure?' } %></td>
      <td><%= link_to 'Send', sounds_sendit_path(sound) %></td>


ルート.rb

  devise_for :users

  match "/sounds/sendit/", :controller => "sounds", :action => "sendit"

  resources :users, :sounds

既存のコントローラーにアクションを追加するため、ルートファイルでこれを行いました(Ruby on Rails)


rake routesを実行すると、出力は次のようになります。

              [...]
           sounds_sendit        /sounds/sendit(.:format)       sounds#sendit 
                   users GET    /users(.:format)               users#index
                         POST   /users(.:format)               users#create
                new_user GET    /users/new(.:format)           users#new
               edit_user GET    /users/:id/edit(.:format)      users#edit
                    user GET    /users/:id(.:format)           users#show
                         PUT    /users/:id(.:format)           users#update
                         DELETE /users/:id(.:format)           users#destroy
                  sounds GET    /sounds(.:format)              sounds#index
                         POST   /sounds(.:format)              sounds#create
               new_sound GET    /sounds/new(.:format)          sounds#new
              edit_sound GET    /sounds/:id/edit(.:format)     sounds#edit
                   sound GET    /sounds/:id(.:format)          sounds#show
                         PUT    /sounds/:id(.:format)          sounds#update
                         DELETE /sounds/:id(.:format)          sounds#destroy
                    root        /                              home#index

(実際には最初の行がわかりません。なぜ POST / GET がないのか、なぜ他のデフォルト アクションのように sound_sendit で sendit_sound がないのか? どうすれば修正できますか?)

ご協力ありがとうございました

4

3 に答える 3

2

idをparamとするアクションへのルートがないため、railsはidがフォーマットであると想定します。そのためのルートを作成する必要があります。

resources :sounds do
  post :sendit, on: :member
end
于 2012-07-31T09:14:06.577 に答える
2

これの代わりに :

match "/sounds/sendit/", :controller => "sounds", :action => "sendit"

これを使って:

  resources :sounds do
    member do
      get :sendit
    end
  end

sendit_sound_path次に、ヘルパーを使用してアクションに正しくリンクできるようになります。

link_to "link text", sendit_sound_path(sound_object)

これでうまくいくことを願っています...

于 2012-07-31T09:16:31.600 に答える
1

ルートでidパラメータを定義する必要があります。ここを参照してください。

match "/sounds/:id/sendit/", :controller => "sounds", :action => "sendit"

'as'オプションを使用してルートに名前を付けることができます。上記のサイトの例:

match 'exit' => 'sessions#destroy', :as => :logout

getのみが必要な場合は、matchの代わりにgetを使用できます。例:

また:

match 'photos/show' => 'photos#show', :via => :get

以下:

get 'photos/show'
于 2012-07-31T09:14:18.437 に答える