【问题标题】:RESTful API Ruby on RailsRESTful API Ruby on Rails
【发布时间】:2012-07-17 06:28:37
【问题描述】:

我是第一次使用 Ruby on Rails,并且已经启动并运行了一个应用程序。这是快速数据库定义:

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

Answers
- id: int
- answer_value: text

我希望能够在浏览器中输入:“http://localhost:3000/teams/1/answers/purple” 如果第 1 队回答紫色。

我认为将以下内容添加到我的 routes.rb 文件中可以让我这样做,但事实并非如此。

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

我可以通过转到 "http://localhost:3000/teams/1/answers/1" 看到团队 1 的第一个答案,但我不知道如何通过 URI 实际设置值。

【问题讨论】:

    标签: ruby-on-rails ruby rest restful-url


    【解决方案1】:

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

    【讨论】:

    • 我认为我们正在接近这个答案。我没有意识到接受我在原始问题中使用的 URL 的函数是答案控制器中的显示操作。我相信我需要将其更改为 Answer.new(params[:id]),而不是 Answer.find_by_answer_value。我不是在查找以前的答案,而是在尝试创建另一个答案。现在,我遇到了“”的“未定义方法 `stringify_answers”:String'...我在哪里可以找到调用 new 的正确方法?
    • 澄清一下,我正在尝试使用 URL 设置值,而不是查找以前创建的答案
    【解决方案2】:

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

    /teams/1/answers

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

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

    【讨论】:

    • 感谢您的快速回复!有没有办法设置 Ruby on Rails 以期望 url 上的 answer_value 而不是记录 ID?
    • 当然有。但我确实建议您遵循 rails 方式,使用像 inherit_resources 这样的 gem,您甚至不需要在控制器中编写任何代码。
    【解决方案3】:

    您需要覆盖模型中的 to_param 方法,尽管有一些警告,但它可以做您正在寻找的事情 - 包括需要使用 @Chirantan 建议的 Answer.find_by_answer_value(params[:id]) 为您的所有查找器。您可以在 Railscast on the subject 中找到更多信息,或在 Rails API 中搜索 to_param 并选择 ActiveRecord::Integration 下的条目。

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

    【讨论】:

      【解决方案4】:

      在浏览器中输入内容不会执行发布,无论您在路线中输入什么,它只会执行获取。 通过 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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-12-07
        • 1970-01-01
        • 2018-02-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-28
        • 2016-07-24
        相关资源
        最近更新 更多