2015-05-22 71 views
3

我有这样的渲染的方法控制JSON包括方法:在模型应该接受语言参数Rails的渲染参数

render :json => @boats, :include => {:port => {:only => [:id, :name], :include => {:city => {:only => [:id, :name], :methods => :translatedCity}}}} 

translatedCity方法。

def translatedCity  
    language = params[:language] 
    puts "translatedCity.language=" + language 
    city = TranslationService.translateCity(self.city_id, language)   
    return city.element_translation 
    end 

我在控制器中有参数。有没有办法将这个参数传递给模型中的方法?

+0

translatedCity之前将需要接受像这样translatedCity参数(语言),以便您可以访问params [:language]中的值,只有控制器可以访问params散列。 阅读此: http://stackoverflow.com/questions/10237388/how-do-you-pass-data-from-a-controller-to-a-model-with-ruby-on-rails – rii

回答

1

所有答案都不错!

我只是不喜欢的东西:

在控制器:

boat.port.language = params[:language] 

在模型:

attr_accessor :language 
    @language 

    def translatedCity    
    city = TranslationService.translateCity(self.city_id, language)   
    return city.element_translation 
    end 

你觉得呢?

+0

似乎是合理的。我觉得有趣的是,向模型中添加临时请求数据,以便以后我可以调用实例方法,但对于每个模型都有自己的:) –

1

不幸的是,传递需要params to_json的方法的过程并没有很好地构建到rails中。一个典型的模式是修改模型上的as_json方法接受自定义键,然后调用to_json(或render :json

# city.rb model 
def translatedCity(language) 
    puts "translatedCity.language=" + language 
    city = TranslationService.translateCity(self.city_id, language)   
    return city.element_translation 
end 

def as_json(options = {}) 
    json_to_return = super 
    if options.has_key? :translatedCity 
    city_translation = self.translatedCity(options[:translatedCity][:language]) 
    json_to_return[:translatedCity] = city_translation 
    end 

    return json_to_return 
end 
现在在你的控制器

你accoringdly

render :json => @boats, 
    :include => { 
    :port => { 
     :only => [:id, :name], 
     :include => { 
     :city => { 
      :only => [:id, :name], 
      :translatedCity => params[:language] 
     } 
     } 
    } 
    } 
1

as_json没有按过的一切不支持需要参数的方法,但这是使用构建所需JSON的Presenter(或Decorator或View Model,取决于您所谈论的人)的好地方。 Draper是一个宝石与,如果你想一个帮助,和你的控制器看起来像

data = @boats.map do |boat| 
    BoatPresenter.new(boat).as_json(language: params[:language]) 
end 
render json: data 

然后BoatPresenter将增加其as_json你想要的额外数据:

def as_json(options = {}) 
    @boat.as_json(options).tap do |json| 
    json[:translated_city] = @boat.translated_city(options[:language]) 
    end 
end 

你也可以有BoatPresenter添加您的默认include s等,如果你想要一个标准集,而不需要控制器担心它。如果你不想自己做数组映射,Draper还提供了收集演示者(例如​​)。


如果你不愿意添加类,你也可以直接覆盖as_jsonBoat来处理language选项:

def as_json(options = {}) 
    super(options).tap do |json| 
    json[:translated_city] = translated_city(options[:language]) 
    end 
end 
0

您可以在会话变量设置的“语言”,并在控制器执行to_json之前设置它,在你的方法破坏会话回报follwoing

def translatedCity(language=nil) 
    language ||= session[:language] 
    puts "translatedCity.language=" + language 
    city = TranslationService.translateCity(self.city_id, language)   
    session[:language] = nil #destroy session, or use session.delete(:language)   
    return city.element_translation 
end 


session[:language] = language 
render :json => @boats, :include => {:port => {:only => [:id, :name], :include => {:city => {:only => [:id, :name], :methods => :translatedCity}}}} 
+0

是否可以在会话中保存这种数据?我的意思是我们可能需要更多的数据来传递相同类型的参数,你怎么看? –