0

我正在尝试在现有视图(模型的“显示”视图)上实现联系我们表单。

我为 NilClass:Class 得到了一个未定义的方法“model_name”,但我不确定我是否正确地实现了一些东西。

在我的 show.html.erb

<%= form_for @message do |f| %>
  <%= f.error_messages %>
  <p>
    <%= f.label :name %><br />
    <%= f.text_field :name %>
  </p>
  <p>
    <%= f.label :email %><br />
    <%= f.text_field :email %>
  </p>
  <p>
    <%= f.label :content, "Message" %><br />
    <%= f.text_area :content %>
  </p>
  <p><%= f.submit "Send Message" %></p>
<% end %>

在具有站点所有操作(索引、更新、显示)的主控制器中,我添加了以下操作

  # GET /listings/1
  # GET /listings/1.json
  def show
    @listing = Listing.find(params[:id])

    respond_to do |format|
      format.html # show.html.erb
      format.json { render json: @listing }
    end
  end


  def newmessage
    @message = Message.new
  end


  def sendmessage
    @message = Message.new(params[:message])
    if @message.valid?
     #  MessageMailer.new_message(@message).deliver
      flash[:notice] = "Message envoy avec succes"
      redirect_to root_path
    else
      render :newmessage
    end
  end

我的 Message.rb 类看起来像这样:

class Message
  extend ActiveModel::Naming
  include ActiveModel::Conversion
  include ActiveModel::Validations
  include ActionView::Helpers::TextHelper

  attr_accessor :name, :email, :message

  validates :name, 
            :presence => true

  validates :email,
            :format => { :with => /\b[A-Z0-9._%a-z\-]+@(?:[A-Z0-9a-z\-]+\.)+[A-Za-z]{2,4}\z/ }

  validates :message,
            :length => { :minimum => 10, :maximum => 1000 }


  def initialize(attributes = {})
    attributes.each do |name, value|
      send("#{name}=", value)
    end
  end


   def persisted?
     false
    end

end
4

1 回答 1

2
def your_action_where_you_render_form
  @message = Message.new
end

def create
  @message = Message.new(params[:message])
  if @message.save
    do this
  else
    do that
  end
end

当您使用它构建表单时<%= form_for @message do |f| %>,意味着您需要在呈现表单的操作中初始化该变量,就像您在名为 newmessage 的操作中所做的那样,但是如果您想使用该操作,您必须将 url 添加到表单中喜欢这里Rails 3 Form For Custom Action

  def show
    @listing = Listing.find(params[:id])
    @message = Message.new

    respond_to do |format|
      format.html # show.html.erb
      format.json { render json: @listing }
    end
  end
于 2013-05-28T20:48:16.703 回答