ruby-on-rails - 保存"Stop" 模型实例时未定义的方法

  显示原文与译文双语对照的内容
0 0

我的Rails 应用程序由touristic路由组成。 每个路由器都有许多停止和路点,并且停止了类别。

路点只是路由和停止之间的中间模型,因为停止可以属于许多路由。

因此,当我尝试保存一个停止时,我得到了错误:

undefined method `category' for #<Stop:0x007fa067acea90>

和 @stop.save" 线is以红色高亮显示:

respond_to do |format|
 if @stop.save
 Waypoint.create(route_id: params[:route_id], stop_id: @stop.id)
 #print out category id or name here
 category = params[:category]

在我的停止控制器中,我在创建时拥有:

def create
@stop = Stop.new(stop_params)
respond_to do |format|
 if @stop.save
 Waypoint.create(route_id: params[:route_id], stop_id: @stop.id)
 #print out category id or name here
 category = params[:category]
 #once printed save it (stop category)
 StopCategory.create(category_id: category, stop_id: @stop.id)
 format.html { redirect_to @stop, notice: 'Stop was successfully created.' }
 format.json { render :show, status: :created, location:@stop }
 else
 format.html { render :new }
 format.json { render json: @stop.errors, status: :unprocessable_entity }
 end
end

在我的路点控制器上,我创建了这个:

 def create
 @waypoint = Waypoint.create(waypoint_params)
 redirect_to @waypoint.route
end

这是停止模型:

class Stop <ActiveRecord::Base
validates :description, length: { maximum: 140 }
validates :category, presence: true
#Image Uploader
mount_uploader :stop_image, StopImageUploader
#Relationship with stops and waypoints
has_many :waypoints
has_many :routes, through: :waypoints
# Relationship with categories
has_many :stop_categories
has_many :categories, through: :stop_categories 

结尾

这是该表单的视图:

<h2>Create a new stop:</h2><br>
 <%= form_for(@stop) do |f| %>
 <% if @stop.errors.any? %>
 <div id="error_explanation">
 <h2><%= pluralize(@stop.errors.count,"error") %> prohibited this stop from being saved:</h2>
 <ul>
 <% @stop.errors.full_messages.each do |message| %>
 <li><%= message %></li>
 <% end %>
 </ul>
 </div>
 <% end %>
 <div class="field">
 <%= f.label :name %><br>
 <%= f.text_field :name %>
 </div>
 <select name="category" id=""> 
 <option value="" disabled selected> Select a Category </option>
 <% @categories.each do |category| %>
 <option value="<%= category.id %>"> <%= category.name %> </option>
 <% end %>
 </select>
 <div class="field">
 <%= f.label :description %><br>
 <%= f.text_area :description %>
 </div>
 <div class="field">
 <%= f.label :stop_image %><br>
 <%= f.file_field :stop_image %>
 </div>
 <div class="field">
 <%= f.label :stop_lat %><br>
 <%= f.number_field :stop_lat, :class => 'text_field', :step => 'any' %>
 </div>
 <div class="field">
 <%= f.label :stop_long %><br>
 <%= f.number_field :stop_long, :class => 'text_field', :step => 'any' %>
 </div>
 <%= hidden_field_tag :route_id, params[:id] %>
 <div class="actions">
 <%= f.submit %>
 </div>
 <% end %> 
 <h2>Add existing stop</h2>
 <br>
 <%= form_for(@waypoint) do |f| %>
 <div class="field">
 <%= f.label :stop_id %><br>
 <%= f.number_field :stop_id %>
 </div>
 <%= f.hidden_field :route_id %>
 <div class="actions">
 <%= f.submit %>
 </div>
 <% end %> 
 <%= link_to 'Edit', edit_route_path(@route) %> |
 <%= link_to 'Back', routes_path %>
 <br>
 <br>
 <br>
 </div>

有什么想法吗?

谢谢!

时间:原作者:7个回答

0 0

你的停止模型中是否有'类别'属性? 如果没有,则以下内容没有意义:

validates :category, presence: true

这可能是失败的原因。

如果要验证类别的存在,则需要用类似如下的方式替换该检查:

validate :has_categories
def has_categories # make this private
 if categories.blank?
 # add errors here
 end
end

以下可能也适用:

validates :categories, presence: true
原作者:
0 0

在停止模式中,应该替换行

validates :category, presence: true

validates :categories, presence: true

验证器将属性/关联名作为参数,而不是关联的模型名。

你的关联称为 categories,因此你需要执行验证。

原作者:
...