Ruby on rails RESTful API Ruby on Rails

Ruby on rails RESTful API Ruby on Rails,ruby-on-rails,ruby,rest,restful-url,Ruby On Rails,Ruby,Rest,Restful Url,我第一次玩RubyonRails,并且有一个应用程序正在运行。以下是快速数据库定义: Teams - id: int - name: char[20] Answers - id: int - answer_value: text 我希望能够键入:http://localhost:3000/teams/1/answers/purple“在浏览器中 如果第一队回答紫色 我原以为在routes.rb文件中添加以下内容可以让我做到这一点,但事实并非如此 resources :teams do r

我第一次玩RubyonRails,并且有一个应用程序正在运行。以下是快速数据库定义:

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

Answers
- id: int
- answer_value: text
我希望能够键入: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“,但我不知道如何通过URI实际设置值。

如果我理解正确,在您回答控制器的显示操作中,而不是执行
Answer.find(params[:id])
,执行
Answer.find by_Answer_值(params[:id])

如果您想创建答案,请发送至

/小组/1/答案

参数为:answer=>{:answer\u value=>'purple'}


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

您需要在模型中超越
to_param
方法,该方法可以完成您正在寻找的内容,尽管有一些警告-包括需要使用@Chirantan建议的
应答。通过应答值(params[:id])查找应答
适用于所有查找者。您可以在此中找到更多信息,或在中搜索
to_param
,然后选择ActiveRecord::Integration下的条目


或者,您可以使用类似gem的工具,它提供了一些更全面的功能并控制URL的构造。

在浏览器中键入内容不会执行post,无论您在路由中放置了什么,它只会执行get。 通过get创建一些东西不是RESTful的,你真的不应该这么做。也就是说,既然你说你只是在“玩弄rails”,你可以这样做:

如果你想要一个get来创建这个东西,你必须在routes中设置它/团队/1/答案/紫色

get '/teams/:team_id/answers/:answer_value' => 'answers#create'
然后在answers控制器中,创建操作,您只需检查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

谢谢你的快速回复!是否没有办法将RubyonRails设置为期望url上的answer_值而不是记录ID?当然有。但是我建议您按照rails的方式,使用诸如inherit_resources之类的gem,您甚至不需要在控制器中编写任何代码。我想我们已经接近这个答案了。我没有意识到接受我在原始问题中使用的URL的函数是answers控制器中的show操作。我相信我需要将其更改为Answer.new(params[:id]),而不是Answer.find_by_Answer_值。我不是在查找以前的答案,而是在尝试创建另一个答案。现在,我遇到了“:String”的“undefined method`stringify_answers”。。。我在哪里可以找到调用new的正确方法?我只是想澄清一下,我试图用URL设置值,而不是查找以前创建的答案