未使用的未定义方法

时间:2014-07-27 07:59:38

标签: ruby-on-rails

你好我是ruby on rails的新手。我有奇怪的问题。我使用了一些教程并得到了我不应该得到的错误。

我有控制器

class DiaryController < ApplicationController

before_action :authenticate_user!

respond_to :html, :xml, :json
respond_to :js, :only => [:create, :update, :destroy]

def create
@record = Record.create(record_params)
@record.userId=current_user.id

if request.xhr? || remotipart_submitted?
  sleep 1 if params[:pause]
  render :layout => false, :template => (params[:template] == 'escape' ? 'comments/escape_test' : 'diary/create'), :status => (@record.errors.any? ? :unprocessable_entity : :ok)
else
  redirect_to diary_path
end
end

def add
@record = Record.new
#respond_with(@record, :layout => false)
respond_with do |format|
  format.html { render :layout => ! request.xhr? }
end
end

# PUT /comments/1
# PUT /comments/1.xml
def update
  @record = Record.find(params[:id])
  respond_with do |format|
  format.html{ redirect_to @record }
end
end

def delete
  @comment = Comment.destroy(params[:id])
end

def edit
  @record = Record.find(params[:id])
end

def index
  @records = Record.where(userId: current_user.id)
end

private

def record_params
  params.require(:record).permit(:photo, :comment, :date, :photo_cache)
end

有视图

<h1 align="centre">
  Добавить запись
</h1>

<%= render 'form' %>

<%= link_to 'Отмена', diary_path, :id => 'cancel-button' %>

<%= form_for(@record, :remote => (params[:action] == 'add' ? true : false)) do |f| %>

<fieldset>
  <div class="field">
    <%= f.label :date, :class => 'required' %><br />
    <%= f.date_select :date %>
  </div>

  <div class="field">
    <%= f.label :comment %><br />
    <%= f.text_area :comment %>
  </div>

  <div class="field">
    <%= image_tag(@record.photo_url(:thumb)) if @record.photo? %><br />
    <%= f.label :photo %><br/>
    <%= f.file_field :photo %><br/>
    <%= f.hidden_field :photo_cache %>
  </div>

 </fieldset>

<table>
  <tr>
    <td>
      <div class="actions">
        <%= f.submit "Добавить", :data => {:'disable-with' => "Submitting..."} %>
      </div>
    </td>
    <td>
      <%= link_to 'Отмена', diary_path, :id => 'cancel-button' %>
    </td>
  </tr>
</table>

获取ActionView :: Template :: Error(未定义的方法`records_path'用于#&lt;#:0x000000054461c8&gt;):错误“&lt;%= form_for(@record,:remote =&gt;(params [:action] ] =='添加'?true:false))do | f |%&gt;“线。甚至我没有使用过records_path。

我有路线

devise_for :users
get 'welcome/index'
root 'welcome#index'
get 'diary' => 'diary#index'
get 'diary/add_record', to: 'diary#add', as: 'add_record'
post 'diary/add_record', to: 'diary#create'
get 'diary/edit_record/:id', to: 'diary#edit'
delete 'diary/edit_record/:id' => 'diary#delete

然后尝试使用add_record路由。也许最好使用资源:records.But我想弄清楚为什么我的路线不起作用。

查看名称“日记”。

1 个答案:

答案 0 :(得分:3)

因为您是RoR的新手,请让我解释一下您收到错误的原因


form_for

form_for是您收到此错误的可能的原因(哦,我刚看到它实际上说明这是错误发生的地方 - 甜蜜)

您遇到的问题是,form_for是一种在ActiveRecord对象周围呈现 表单的方法。通过在newcreate操作中使用AR(允许您在提交后在表单上显示输入数据)来为数据提供一些半持久性是意味着

当您将对象传递给form_for时,Rails会自动“构建”ActiveRecord对象中的表单,其中一个选项是url

-

<强>路线

您遇到的问题是传递给form_for的对象采用model_name属性来构建路由。这意味着如果你想通过传递一个对象来使用form_for方法,那么它将寻找与该对象直接相关的路由

如果您没有设置任何[model]_path路线,您可能会收到错误。修复首先涉及路线,其次涉及控制器

#config/routes.rb
root 'welcome#index'
devise_for :users

resources :diary, path_names: { new: "add_record", create: "add_record", edit: "edit_record", destroy: "edit_record" }
resources :welcome, only: :index

这取决于Rails的路由结构是built around resources的想法 - 您拥有的每条路由都应该导致特定的控制器操作。虽然包含自定义操作完全没问题,但您必须明白路由结构的基础是构造resourceful路由,这实际上意味着Rails会感知每个控制器/模型都有相应的路由:

enter image description here

-

<强>网址

要注意的第二件事是表格的url

如果您的路线设置如上,并且路线结构与您的模型结构(不同的名称)不同,您将需要使用以下设置明确定义url

<%= form_for @record, url: your_custom_path do |f| %>