你好我是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我想弄清楚为什么我的路线不起作用。
查看名称“日记”。
答案 0 :(得分:3)
因为您是RoR的新手,请让我解释一下您收到错误的原因
form_for
是您收到此错误的可能的原因(哦,我刚看到它实际上说明这是错误发生的地方 - 甜蜜)
您遇到的问题是,form_for
是一种在ActiveRecord对象周围呈现 表单的方法。通过在new
和create
操作中使用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会感知每个控制器/模型都有相应的路由:
-
<强>网址
要注意的第二件事是表格的url
如果您的路线设置如上,并且路线结构与您的模型结构(不同的名称)不同,您将需要使用以下设置明确定义url
:
<%= form_for @record, url: your_custom_path do |f| %>