如何使用Ruby on Rails将数据从控制器传递到模型?

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.cityrequest.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.

希望有所帮助.