2012-07-17 80 views
0

我第一次玩Ruby on Rails,并启动了一个应用程序。这里的快速数据库定义:REST风格的API Ruby on Rails

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

Answers 
- id: int 
- answer_value: text 

我希望能够键入:“HTTP://本地主机:3000 /团队/ 1 /答案/紫色”在浏览器中 如果团队1个回答紫色。

我认为添加以下内容到我的routes.rb文件将允许我这样做,但它没有。

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

我可以去看到球队1的第一个答案为“HTTP://本地主机:3000 /团队/ 1 /答案/ 1”,但我不知道如何通过实际设定的值URI。

回答

0

如果我理解正确的话,在你的回答,而不是做Answer.find(params[:id])控制器的表演动作,不要Answer.find_by_answer_value(params[:id])

+0

我想我们正在接近这个答案。我没有意识到,接受我在原始问题中使用的URL的函数是答案控制器中的show操作。我相信我需要将它改为Answer.new(params [:id]),但不是Answer.find_by_answer_value。我不想查找以前的答案,我正在尝试创建另一个答案。现在,我正在运行“未定义的方法'stringify_answers'为<我在URL上输入的值>”:String'...我在哪里可以找到调用new的正确方法? – 2012-07-17 09:56:12

+0

只是为了澄清,我试图用URL设置值,而不是查找以前创建的答案 – 2012-07-17 10:09:01

0

如果你想创建一个答案,请至

/团队/ 1 /回答

与参数:答案=> {:answer_value => '紫色'}

不要追加answer_value的URL,看起来像它的记录ID。

+0

感谢您的快速响应!有没有办法设置Ruby on Rails期望在url上的answer_value而不是记录ID? – 2012-07-17 09:44:54

+0

当然有。但我确实建议你遵循rails的方式,gem就像inherit_resources,你甚至不需要在控制器中编写任何代码。 – Prajna 2012-07-19 11:16:42

0

您需要在模型中搭配to_param方法,尽管存在一些注意事项 - 包括需要使用@Chirantan建议的所有寻找器的Answer.find_by_answer_value(params[:id]),该方法可以做你正在寻找的东西。您可以在Railscast on the subject中找到更多信息或在Rails API中搜索to_param,然后选择ActiveRecord :: Integration下的条目。

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

0

在浏览器中键入内容不会执行任何操作,无论您将哪些内容放入路由中,它只会执行get操作。 通过get创建某些东西不是RESTful,而且你真的不应该这样做。也就是说,既然你说你只是在玩轨道游戏,你可以这样做:

如果你想得到创建的东西,你必须在路线中设置它。 /团队/ 1 /答案/紫色

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

然后在你的答案控制器,创建行动,你可以只检查一个PARAMS [:TEAM_ID],而params [:答案值],并确保被之前的设置保存。

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