未定义的方法模型路径,Form_for不保存,正确发布,Rails框架

时间:2013-05-09 14:10:14

标签: ruby-on-rails

抱歉,我是rails的新手

现在我正在尝试构建一个像https://pinboard.in这样的小应用程序,我正在尝试与他们一起暑期实习。

这是我的书签模型

class Bookmark < ActiveRecord::Base
  attr_accessible :url, :title, :description, :counter 
  belongs_to :user 

  #validates that url has https:// or http://
  validates :url, :format => { :with => /(^$)|(^(http|https):\/\/[a-z0-9]+([\-\.]{1}[a-z0-  9]+)*\.[a-z]{2,5}(([0-9]{1,5})?\/.*)?$)/ix,
  :message => "Invalid URL" }
end

这是我的书签控制器

class BookmarksController < ApplicationController
    def add_bookmark
        @bookmark = Bookmark.new 

        respond_to do |format|
            format.html 
        end 
    end 

    def draw_recent
        @bookmarks = Bookmark.all
    end 
end

这是我的表格

<%= form_for :bookmark do |f| %>
    URL: <%= f.text_field :url %><br/>
    Title: <%= f.text_field :title %><br/>
    Description: <%= f.text_field :description %><br/>
    <%= f.submit "Submit" %>
<% end %>

一切都得到正确呈现,当我输入信息并提交添加

这是我的输出

Started POST "/add" for 127.0.0.1 at 2013-05-09 09:55:58 -0400
Processing by BookmarksController#add_bookmark as HTML
  Parameters: {"utf8"=>"✓",    "authenticity_token"=>"ZCxA226pOVyu5AkQAmvvfKz5uPQ4gFggPTwrswtqZYk=", "bookmark"=>  {"url"=>"http://litmus.com", "title"=>"Email marketing ", "description"=>"email marketing "},  "commit"=>"Submit"}
Rendered bookmarks/_form.html.erb (1.9ms)
Rendered bookmarks/add_bookmark.html.erb within layouts/application (3.3ms)
Completed 200 OK in 96ms (Views: 95.4ms | ActiveRecord: 0.0ms)

我脑子里有两个想法,好吧我的表格是正确发布但不知何故它没有保存到我的数据库,我的控制器中是否需要一个保存方法?

当我尝试@bookmark而不是:书签时,应用程序会向我发出一个错误,说错了bookmarks.path

undefined method `bookmarks_path

我理解前者你实际上正在使用控制器中的@bookmark实例,而后者正在模型周围....

有人可以开导我吗?我觉得这对你们来说非常微不足道...... :)

1 个答案:

答案 0 :(得分:1)

应该是form_for @bookmark do | f |。您收到undefined method错误,因为您尚未在config / routes.rb中定义路由,请添加:

resources :bookmarks

这将按照CRUD约定添加RESTful资源,因此您应该更改控制器方法的名称,以便开箱即用。您现在需要至少三种方法:

在你的app / controllers / bookmarks_controller.rb中:

第一个会将您的表单呈现在/ bookmarks / new

def new
  @bookmark = Bookmark.new
end

第二个将处理表单提交(除了命名约定之外,不需要您执行任何操作)

def create
  @bookmark = Bookmark.new(params[:bookmark])
  @bookmark.save
end

第三个显示当前'draw_recent'中的书签

def index
  @bookmark = Bookmark.all
end

之后你可以继续验证数据等,但基本流程应该是这样的。

最好从约定开始,以便在您更有信心时更改方法标准名称。