0

初めて Ruby on Rails で遊んでいて、アプリを起動して実行しています。簡単なデータベース定義は次のとおりです。

Teams
- id: int
- name: char[20]

Answers
- id: int
- answer_value: text

チーム 1 が紫と答えた場合、ブラウザーで「http://localhost:3000/teams/1/answers/purple」と入力できるようにしたいと考えています。

私は自分の routes.rb ファイルに以下を追加することでそれができると思っていましたが、そうではありませんでした。

resources :teams do
  resources :answers
  post 'answer_value', :on => :member
end

"http://localhost:3000/teams/1/answers/1" にアクセスすると、チーム 1 による最初の回答を確認できますが、実際に URI を介して値を設定する方法がわかりません。

4

4 に答える 4

0

モデルのto_paramメソッドをオーバーライドする必要があります。これにより、探していることを実行できますが、@Chirantan がAnswer.find_by_answer_value(params[:id])すべてのファインダーで提案したものを使用する必要があるなど、いくつかの注意事項があります。詳細については、このRailscast を参照してください。Rails APIで検索しto_paramて、ActiveRecord::Integration の下のエントリを選択してください。

あるいは、より包括的な機能と URL 構築の制御を提供するFriendlyIdのような gem を使用することもできます。

于 2012-07-17T13:52:46.143 に答える
0

回答を作成したい場合は、に投稿してください

/チーム/1/回答

パラメータ :answer => { :answer_value => '紫' }

answer_value を URL に追加しないでください。レコード ID のようです。

于 2012-07-17T07:50:52.150 に答える
0

ブラウザーに何かを入力しても投稿は実行されません。ルートに何を入力しても、取得のみが実行されます。get で何かを作成することは RESTful ではありません。実際に行うべきではありません。とはいえ、「レールをいじっているだけ」だと言っているので、次のようにすることができます。

ものを作成するために get が必要な場合は、ルートでそのように設定する必要があります。/teams/1/answers/紫

get '/teams/:team_id/answers/:answer_value' => 'answers#create'

次に、回答コントローラーでアクションを作成し、params[:team_id] と params[:answer value] を確認して、保存前に設定されていることを確認します。

def create
  @answer = Answer.new()
  @answer.team_id=params[:team_id]
  @answer.answer_value=params[:answer_value]


  respond_to do |format|
    if @answer.save
      format.html { redirect_to @answer, notice: 'Answer was successfully created.' }
      format.json { render json: @answer, status: :created, location: @answer }
    else
      format.html { render action: "new" }
      format.json { render json: @answer.errors, status: :unprocessable_entity }
    end
  end
end
于 2012-07-17T16:46:30.383 に答える
0

私があなたを正しく理解していれば、コントローラーのショーアクションに答えるのではなく、実行してAnswer.find(params[:id])くださいAnswer.find_by_answer_value(params[:id])

于 2012-07-17T07:28:40.547 に答える