如何使用 Ruby on Rails 将数据从控制器传递到模型?
Posted
技术标签:
【中文标题】如何使用 Ruby on Rails 将数据从控制器传递到模型?【英文标题】:How do you pass data from a controller to a model with Ruby on Rails? 【发布时间】:2012-05-01 12:24:47 【问题描述】:如何将数据从控制器传递到模型?
在我的application_controller
中,我获取用户的位置(州和城市)并包含一个before_filter
以使其在我的所有控制器中都可以通过
before_filter :community
def community
@city = request.location.city
@state = request.location.state
@community = @city+@state
end
然后我尝试通过以下方式将控制器中检索到的数据添加到模型中:
before_save :add_community
def add_community
self.community = @community
end
但是,数据永远不会从控制器传输到模型。如果我使用:
def add_community
@city = request.location.city
@state = request.location.state
@community = @city+@state
self.community = @community
end
request.location.city
和 request.location.state
方法在模型中不起作用。我知道其他一切都在工作,因为如果我将@city
和@state
定义为字符串,在def_community
下,那么一切正常,除了我没有动态变量,只是放置在模型中的字符串。另外,我知道请求在控制器/视图中工作,因为我可以让它们显示正确的动态信息。问题只是将数据从控制器获取到模型。非常感谢您的宝贵时间。
【问题讨论】:
我建议您删除此问题或您的其他问题,因为它们本质上是相同的。下一次,如果你想让事情更清楚,你可以编辑你原来的问题:***.com/questions/10236645/… 欢迎来到 ***!请记住对您认为有用的所有答案进行投票,包括对他人问题的答案。 “检查”(选择)您问题的最佳答案。 【参考方案1】:您正在努力解决的概念是MVC architecture,这是关于分离职责的。模型应该处理与数据库(或其他后端)的交互,而不需要了解它们正在使用的上下文(无论是 HTTP 请求还是其他),视图不需要了解后端和控制器处理两者之间的交互。
因此,对于您的 Rails 应用程序,视图和控制器可以访问 request
对象,而您的模型则不能。如果你想将当前请求中的信息传递给你的模型,这取决于你的控制器。我将您的add_community
定义如下:
class User < ActiveRecord::Base
def add_community(city, state)
self.community = city.to_s + state.to_s # to_s just in case you got nils
end
end
然后在你的控制器中:
class UsersController < ApplicationController
def create # I'm assuming it's create you're dealing with
...
@user.add_community(request.location.city, request.location.state)
...
end
end
我不喜欢直接传递request
对象,因为这确实保持了模型与当前请求的分离。 User
模型不需要了解 request
对象或它们如何工作。它所知道的只是它得到了一个city
和一个state
。
希望对您有所帮助。
【讨论】:
@Laser 很高兴听到它 :) 编码愉快!【参考方案2】:控制器中的类实例变量(以@开头的)与模型中的变量是分开的。这是 MVC 架构中的模型与控制器。模型和控制器(和视图)是分开的。
您将信息从控制器显式移动到模型。在 Rails 和其他面向对象的系统中,您有多种选择:
使用函数参数
# In the controller
user = User.new(:community => @community)
# In this example, :community is a database field/column of the
# User model
Docs
使用实例变量属性设置器
# In the controller
user = User.new
user.community = @community
# same as above, :community is a database field
当数据不是数据库字段时将数据传递给模型
# In the model
class User < ActiveRecord::Base
attr_accessor :community
# In this example, :community is NOT a database attribute of the
# User model. It is an instance variable that can be used
# by the model's calculations. It is not automatically stored in the db
# In the controller -- Note, same as above -- the controller
# doesn't know if the field is a database attribute or not.
# (This is a good thing)
user = User.new
user.community = @community
Docs
【讨论】:
以上是关于如何使用 Ruby on Rails 将数据从控制器传递到模型?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 Ruby on Rails 5 将数据从 URL 提取到表单中
Ruby on Rails:将数据调用到 javascript 中的首选方法?
如何在 Ruby on Rails 的控制台中调用控制器/视图辅助方法?
如何将 json 数据从 ruby 控制器传递到 javascript (Rails 6.1)?