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

如果我对您的理解正确,请在您回答控制器的显示动作时,而不是做Answer.find(params[:id]),做Answer.find_by_answer_value(params[:id])

于 2012-07-17T07:28:40.547 回答
0

在浏览器中输入内容不会执行发布,无论您在路由中输入什么,它只会执行获取。通过 get 创建东西不是 RESTful,你真的不应该这样做。就是说,既然你说你只是在“玩铁轨”,你可以这样做:

如果你想创建一个东西,你必须在路由中设置它。/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

您需要覆盖to_param模型中的方法,尽管有一些警告,但它可以做您正在寻找的事情 - 包括需要使用 @ChirantanAnswer.find_by_answer_value(params[:id])为您的所有发现者建议的内容。您可以在此Railscast 中找到有关该主题的to_param更多信息,或在Rails API中搜索并选择 ActiveRecord::Integration 下的条目。

或者,您可以使用像FriendlyId这样的 gem ,它提供了一些更全面的功能和对 URL 构造的控制。

于 2012-07-17T13:52:46.143 回答
0

如果您想创建答案,请发布到

/团队/1/答案

带参数 :answer => { :answer_value => 'purple' }

不要将 answer_value 附加到 url,看起来它是记录 id。

于 2012-07-17T07:50:52.150 回答