我希望能够通过控制器中的:to_whom
访问params[:to_whom]
文本值。模型中不存在To_whom。
我得到明智的错误: '未定义的方法`to_whom' for Conversation'
如何添加任意属性以传回rails中的控制器?
此外,在我看来,我做了Message.new
和Conversation.new
,这非常难看。我最初在控制器中设置@conversation = Conversation.new
,但是我发现我必须在第二个控制器方法中重新创建这些变量,这是有意义的(在我点击提交按钮之后)。因此,我没有在@message
方法中设置@conversation
,new
,而是从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 %>
答案 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