在Rails中使用params调用模型方法

时间:2016-05-25 19:48:06

标签: ruby-on-rails ruby-on-rails-5

我有以下问题,让我说我有一个表用户和第二个表UserStrings进行本地化。 UserStrings具有以下列{user_id,language_id,full_name}

我在ApplicationController中也有一个current_language方法,它返回当前语言的id。

我必须使用collection_select,我需要在列表中显示当前语言的用户名。

<%= fb.collection_select(:id, User.all,:id, :full_name, {}, {})%>

问题是User表中没有full_name列。我知道有可能制作模型方法并将其称为而不是名称。

<%= fb.collection_select(:id, User.all,:id, :model_method, {}, {})%>

这个模型方法我想运行这个小行

self.user_strings.find_by(:language_id => current_language).full_name

这是问题所在,我知道在模型中不可能使用控制器方法,因此我无法在模型中获得current_language。是否可以使用param(current_language)调用:model_method。如果没有,还有其他方法让这个工作吗?

PS。并且不可能将current_language重写为Model中的新模型方法,因为它比看起来更复杂。

提前致谢!

2 个答案:

答案 0 :(得分:0)

试试这个

        def method_missing(m, *args, &block)  
             match = m.to_s.match(/regex of languages here/)
              if match
                self.user_strings.find_by(:language_id => match).first_name + self.user_strings.find_by(:language_id => match).last_name
              else
               nil
             end
      end  

你不能直接为它定义动态方法

答案 1 :(得分:0)

collection_select还接受Proc代替方法名称(docs)。

我还没有尝试过,但这应该可行:

<%= fb.collection_select(:id, User.all,:id, Proc.new{ model_method(current_language) }, {}, {})%>