Las*_*ser 9 ruby model-view-controller model ruby-on-rails ruby-on-rails-3
如何将数据从控制器传递到模型?
在我的application_controller我抓住用户的位置(州和城市)并包括一个,before_filter以使其可通过所有控制器访问
before_filter :community
def community
@city = request.location.city
@state = request.location.state
@community = @city+@state
end
Run Code Online (Sandbox Code Playgroud)
然后我尝试通过以下方法将控制器中检索到的数据添加到模型中:
before_save :add_community
def add_community
self.community = @community
end
Run Code Online (Sandbox Code Playgroud)
但是,数据从未从控制器传递到模型.如果我使用:
def add_community
@city = request.location.city
@state = request.location.state
@community = @city+@state
self.community = @community
end
Run Code Online (Sandbox Code Playgroud)
这些方法request.location.city并request.location.state不起作用于模型.我知道其他一切都在工作,因为如果我定义@city和@state作为字符串,def_community那么一切都有效,除了我没有动态变量,只是放在模型中的字符串.此外,我知道请求在控制器/视图中工作,因为我可以让它们显示正确的动态信息.问题只是将数据从控制器传递到模型.非常感谢你的时间.
tsh*_*rif 13
您正在努力解决的概念是MVC架构,即关于分离职责.模型应该处理与DB(或其他后端)的交互,而无需了解它们正在使用的上下文(无论是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
Run Code Online (Sandbox Code Playgroud)
然后在你的控制器中:
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
Run Code Online (Sandbox Code Playgroud)
我不想request直接传递对象,因为这确实维持了模型与当前请求的分离.该User模型不需要了解request对象或它们如何工作.所有它知道它是一个city和一个state.
希望有所帮助.
| 归档时间: |
|
| 查看次数: |
22412 次 |
| 最近记录: |