如何将我的新方法中的参数传递给Rails中的create方法?

时间:2014-04-03 17:26:05

标签: ruby-on-rails ruby

如果已将特定参数传递给新方法,我需要在create方法的末尾调用方法。我试图这样做而不向我正在创建的对象添加新字段,仅仅是为了成为临时“参数桶”。该参数不会用于创建新对象,而是用于保存对象后调用的辅助方法。

所以代码就像......

def new
  @object = Object.new
  if params[:object_id]
    @object_trade = Object.find(params[:object_id])
  end
end

def create
  blah create blah
  if @object.save && @object_trade.present?
    call_method_here(@object_trade.id)
  end
end
但是,我不能把这些碎片放在一起。我觉得我错过了一些明显的东西。

对于它的价值,我可以传递对象或仅仅是我需要做的参数。

感谢任何帮助。

2 个答案:

答案 0 :(得分:2)

重新定义您的方法如下:

def new
  @object = Object.new
  if params[:object_id]
    session[:object_trade] = params[:object_id]
  end
end

def create
  blah create blah
  if @object.save && session[:object_trade].present?
     @object_trade = Object.find(session[:object_trade])
     call_method_here(@object_trade.id)
     session.delete(:object_trade)  ## Remove object_trade from the session
  end
end

每次调用操作时,都会加载控制器的单独实例。因此,您不会在@object_trade操作中获得create。但会话将允许您在不同操作之间共享数据。

注意:

从会话中删除object_trade的原因,即session.delete(:object_trade)是在给定时间,每个会话只能执行一次new操作。这样, antinome(在评论中)提出的问题就不会在if create块行动中执行活动。如果OP希望向用户提供消息,那么他只需在flash部分添加else消息,说明session key invalid..Please try again之类的原因并重定向到新表单。

答案 1 :(得分:2)

Kirti Thorat rightly points out为什么实例变量不起作用,但建议使用会话,这可能是错误的。

如果用户使用object_id导航到“新”页面,但从不提交表单,该怎么办?相反,他们点击后退按钮并发出另一个“新”请求,这次没有object_id,因为他们改变了主意。但是,object_trace仍然在会话中闲逛,应用程序错误地记住原始object_id

我相信闪光灯会遇到类似的问题。

避免会话很容易

以“新”操作呈现的形式呈现隐藏字段:

= hidden_field_tag 'object_id', params[:object_id]

然后,当您提交表单时,object_id将被传递,并且可以作为params[:object_id]用于创建操作。

避免会话的其他理由

  • 更易于理解和调试:随着您的应用程序变得越来越复杂,您会发现如果请求中发生的错误您运行的每个时间都会更加简单具有相同参数的相同请求。尝试修复一个无法可靠复制的错误并不好玩。
  • 无状态方法与有状态方法一样容易实现
  • 避免您的应用配置使用的任何类型的会话存储的限制:
    • 如果使用cookie存储,你最终会想要存储一些太大而不适合cookie的东西。
    • 如果使用数据库存储,您可能有一天会遇到无限期地在会话中出现值的问题。
    • 如果使用memcache存储,您将无法将应用程序扩展到多个memcached实例,并且您的应用程序也会在您需要重新启动memcached(或其所在的服务器)时中断。