【问题标题】:How to access multiple models in a single contoller, Ruby on Rails?如何在单个控制器 Ruby on Rails 中访问多个模型?
【发布时间】:2012-09-14 20:45:33
【问题描述】:

这是我的索引方法,它试图访问 2 个不同的模型,即会话和电子邮件:

def index
    user_session = Session.find_by_user_id(user_id)

if !user_session.blank?
  if setting_orig = GlobalSetting.find_by_settings_session_id(user_session.id)
      @setting = setting_orig.dup
  end

else
  @setting = GlobalSetting.first.dup
end 

结束

但是,当我尝试创建这个表单时:

<%= form_for(@setting) do |f| %>
 <%= f.text_field :username %>
 <%= f.password_field :password %>
<%= f.submit "Submit" %>

我看到这个错误,NilClass:Class 的未定义方法'model_name'。如何让它工作,有什么建议吗?

【问题讨论】:

  • 查看堆栈跟踪中的行号以找出错误来自代码的何处。看起来@setting 可能是 nil,因为 form_for 必须检查它以找出 model_name。
  • 我认为这很混乱,因为我们正在访问 2 个模型,当我评论 user_session = Session.find_by_user_id(user_id) 这一行时,它工作正常

标签: ruby-on-rails ruby-on-rails-3 model controller


【解决方案1】:

Unixmonkey 的想法是正确的,请查看您的堆栈跟踪并找出错误的来源。

此外,您的语句逻辑存在漏洞。如果 user_session 不为空(有人已登录)但您找不到 setting_session_id 等于 user_session.id 的电子邮件(用户可能没有电子邮件?)然后@setting 永远不会被声明,因此您将运行进入你的错误。

def index
  user_session = Session.find_by_user_id(user_id)

  if !user_session.blank? AND setting_orig = GlobalSetting.find_by_settings_session_id(user_session.id)
    @setting = setting_orig.dup
  else
    @setting = GlobalSetting.first.dup
  end 
end

【讨论】:

  • 对不起,不是EMail,应该是GlobalSetting,第一行是默认设置,其余行是用户自定义设置。
  • 请记住,这是有效的:user_session = nil #user_session = Session.find_by_user_id(user_id)
  • 好吧,我只是想关闭你的代码。即使是GlobalSetting 而不是EMail,问题仍然存在,您的逻辑中有一个漏洞@setting 永远不会被声明。为了向自己证明 @setting 没有被声明是问题所在,请尝试注释掉所有 if 语句并留下 @setting = GlobalSetting.first.dup。如果你的代码不能正常工作,那么还有其他问题
猜你喜欢
  • 1970-01-01
  • 2011-01-26
  • 1970-01-01
  • 1970-01-01
  • 2014-11-14
  • 1970-01-01
  • 1970-01-01
  • 2013-08-14
  • 1970-01-01
相关资源
最近更新 更多