Rails has_many 控制器中的关联问题

Posted

技术标签:

【中文标题】Rails has_many 控制器中的关联问题【英文标题】:Rails has_many association issue in controller 【发布时间】:2015-07-30 11:04:38 【问题描述】:

我有一个用该设计设计的公司模型,当公司登录时,公司可以创建事件,以便公司有许多事件和事件属于公司,事件控制器被指定为

class EventsController < ApplicationController
  before_action :company_signed_in?
  def index
    @events = Event.all
  end

  def new
    @event = current_company.events.build
  end

  def create
    @event = current_company.events.build(event_params)
    if @event.save
      flash[:success] = "Profile saved"
      redirect_to company_events_path(current_company)
    else
      flash[:error] = "Error"
      render :new
    end
  end

  def show
    @event = current_company.events.where(id: params[:id]).first
  end

  private

  def event_params
    params.require(:event).permit(:name, :company_id, :category_id, :event_date, :event_info, :place, :event_avatar)
  end

end

公司模式有

has_many :events

事件模型有

belongs_to :company

事件的新视图有

   <%= form_for [current_company, @event] do |f| %>
 <%= f.text_field :name %>
    <% end %>

并且显示视图有

<%= @event.name %>

我的路线是

resources :companies do
    resource :company_profile, :events
  end

现在我想做的是当前公司可以创建一个活动,当活动创建时,它应该被重定向到刚刚制作的活动的展示页面

我需要创建一个事件,这样我才能获得像companies/3/events/3这种类型的url这样的url

问题是当我要进行显示操作时,我得到未定义的方法“名称”请帮助!在日志中我有

Started GET "/companies/3/events" for 127.0.0.1 at 2015-07-30 16:41:54 +0530
Processing by EventsController#show as html
  Parameters: "company_id"=>"3"
  Company Load (0.3ms)  SELECT  `companies`.* FROM `companies` WHERE `companies`.`id` = 3  ORDER BY `companies`.`id` ASC LIMIT 1
  CompanyProfile Load (0.3ms)  SELECT  `company_profiles`.* FROM `company_profiles` WHERE `company_profiles`.`company_id` = 3 LIMIT 1
  Event Load (0.3ms)  SELECT  `events`.* FROM `events` WHERE `events`.`company_id` = 3 AND `events`.`id` IS NULL  ORDER BY `events`.`id` ASC LIMIT 1
  Rendered events/show.html.erb within layouts/application (12.5ms)
Completed 500 Internal Server Error in 32ms (ActiveRecord: 0.8ms)

ActionView::Template::Error (undefined method `name' for nil:NilClass):
    1: 
    2: <label>Name : </label>
    3: <%= @event.name %>
    4: <%= @event.event_date %></br></br>
    5: <label>Age : </label>
    6: <%= @event.place %></br></br>
  app/views/events/show.html.erb:3:in `_app_views_events_show_html_erb__541678279__634038278'

【问题讨论】:

您能否澄清一下,问题是我无法创建新活动?有什么错误吗?意外行为? 它再次呈现新动作 什么时候渲染新动作? 应该有一些错误。你能把你的日志贴出来吗? 当我点击提交按钮时,这是在控制台参数:"utf8"=>"✓", "authenticity_token"=>"JJPwiClneDLnXUiHqn4BO8OtkelWqwqMwPyc4cCAhu7Tb5RvkmHXIC6LWG16wBm02uLodZtQ4TYxB/WE6smozg=>" "name"=>"wwee", "commit"=>"Create Event", "company_id"=>"3" 公司负载 (0.9ms) SELECT companies.* FROM companies WHERE companies.@ 987654332@ = 3 ORDER BY companies.id ASC LIMIT 1 CompanyProfile Load (0.3ms) SELECT company_profiles.* FROM company_profiles WHERE company_profiles.company_id = 3 LIMIT 1 (0.4ms) 0.2ms) 回滚 【参考方案1】:

您没有将事件的 id 传递给 show 操作。如参数所示,仅传递company_id

   Parameters: "company_id"=>"3"

所以当它查询 id 为 NULL 的事件时,它没有找到任何事件,因此 null.name 正在崩溃

将事件的id 传递给显示操作。或者为了测试你应该这样做

def show
  @event = current_company.events.first
end

【讨论】:

【参考方案2】:

您应该尝试以下方法,看看是否有效:

def show
@event = Event.find(params[:id])
end

【讨论】:

以上是关于Rails has_many 控制器中的关联问题的主要内容,如果未能解决你的问题,请参考以下文章

如何通过rails中的关联定义has_many

如何使用带有 has_many 的 PaperTrail 版本控制:通过在 Rails 4 中实现关联

如何将参数传递给 Rails 4 中的 has_many 关联范围?

如何区分相似的has_many:通过Rails中的关联?

如何将记录添加到has_many:通过rails中的关联

通过Rails中的关联使用has_many创建新模型时出现不允许的参数错误