在ruby on rails 4中,如何在forms_for帮助器中设置与模型无关的属性?

时间:2014-06-03 08:11:18

标签: ruby-on-rails ruby forms ruby-on-rails-4 parameters

我希望能够通过控制器中的:to_whom访问params[:to_whom]文本值。模型中不存在To_whom。

我得到明智的错误: '未定义的方法`to_whom' for Conversation'

如何添加任意属性以传回rails中的控制器?

此外,在我看来,我做了Message.newConversation.new,这非常难看。我最初在控制器中设置@conversation = Conversation.new,但是我发现我必须在第二个控制器方法中重新创建这些变量,这是有意义的(在我点击提交按钮之后)。因此,我没有在@message方法中设置@conversationnew,而是从new中移除了所有行,并在视图中执行了.new语法。有没有更优雅的方式来编写这段代码,所以它不是那么hacky感觉?

控制器:

 class ConversationsController < ApplicationController
   attr_accessor :conversation, :user, :to_whom

   # this is the method that generates the below view
   def new
   end

   def create
      ...
   end
 end

查看:

<%= form_for([current_user, Conversation.new]) do |c| %>
  <%= c.label :to_whom %>
  <%= c.text_field :to_whom %>

  <%= c.label :subject %>
  <%= c.text_field :subject %>   
  <%= form_for(Message.new) do |m| %>
  <%= m.label :message %>
  <%= m.text_field :text %>

    <div class="actions">
      <%= submit_tag "send" %>
    </div>
  <% end %>
<% end %>

3 个答案:

答案 0 :(得分:2)

m.text_field :to_whom只是构建html输入标记的助手。您可以使用原始html编写自己的内容,使用erb标记填充空白,或者可以使用其他帮助程序,例如text_field_tag

text_field_tag "to_whom", params[:to_whom]

答案 1 :(得分:2)

虚拟属性

您的attr_accessor属于您的模型(不是您的控制器)。目前,您已将其存储在controller中,这在模型级别无效:

#app/models/conversation.rb
Class Conversation < ActiveRecord::Base
    attr_accessor :conversation, :user, :to_whom
end

#app/controllers/conversations_controller.rb
    # remove attr_accessor 

您必须记住,由于Ruby是面向对象的,因此您获得的所有data个对象都来自model。这意味着,如果您致电@conversation = Conversation.new,则该模型的attributes实际上是在conversation模型中创建的

通常,模型将根据您的数据库列设置属性。如果您没有数据库列,则需要使用attr_accessor模块创建相关的getter / setter methods

答案 2 :(得分:0)

我认为你需要使用fields_for helper,它应该是类似下面的内容,

= c.fields_for :message do