活动模型禁止属性错误

有人能够帮助我理解这个错误。 我正在尝试按照构建Web应用程序教程在rails中创建联系表单。 我按照步骤生成了一个消息支架。 然后我修改了我的路线。 接下来它说把它放到消息控制器show动作中。

if @message.save flash[:notice] = 'Thanks for Your Message' format.html { redirect_to root_path } 

我已经这样做了,我在MessagesController中得到以下错误ActiveModel :: ForbiddenAttributesError #create ActiveModel :: ForbiddenAttributesError

这是我的消息控制器文件

 class MessagesController < InheritedResources::Base def show if @message.save flash[:notice] = 'Thanks for Your Message' format.html { redirect_to root_path } end end end 

我的路线文件如下

 # devise_for :users 

资源:产品做资源:订单,只有:[:new,:create] #tells rails需要产品ID号码结束

  # get 'pages/payment' get 'home/about' get 'messages/new' get 'seller' => "products#seller" get 'sales' => "orders#sales" get 'static_pages/productlanding' get "content/veg" get "content/fruit" get "content/mix" get 'subscriptions/new' root 'static_pages#home' 

你为什么要保存 节目动作?

PARAMS

ForbiddenAttributes错误源于Rails的strong_paramsfunction。

保存数据时,您需要通过strong_params方法将参数传递给模型。 这通常通过以下设置实现:

 #app/controllers/messages_controller.rb class MessagesController < ApplicationController def show @message = Message.find(params[:id]) end def new @message = Message.new end def create @message = Message.new(message_params) @message.save end private def message_params params.require(:message).permit(:your, :message, :params) end end 

这就是你的controller应该如何构建的。 我相信,您的错误是由于您缺少params传递给模型中的属性(因此您调用@save导致尝试使用非数据填充模型)。

奇怪。 您可以在控制器的“show”方法中执行保存方法,该方法负责在单独的页面上显示内容。

您应该替换如下:

 def create if @message.save flash[:notice] = 'Thanks for Your Message' format.html { redirect_to root_path } end end 

我已设法通过以下方式对此进行排序! 谢谢你的帮助

 class MessagesController < ApplicationController before_action :set_message, only: [:show, :edit, :update, :destroy] # GET /messages # GET /messages.json def index @messages = Message.all end # GET /messages/1 # GET /messages/1.json def show end # GET /messages/new def new @message = Message.new end # GET /messages/1/edit def edit end # POST /messages # POST /messages.json def create @message = Message.new(message_params) respond_to do |format| if @message.save flash.now[:notice] = 'Thank you for your message!' format.html { redirect_to root_path } format.json { render :show, status: :created, location: @message } else format.html { render :new } format.json { render json: @message.errors, status: :unprocessable_entity } end end end # PATCH/PUT /messages/1 # PATCH/PUT /messages/1.json def update respond_to do |format| if @message.update(message_params) format.html { redirect_to @message, notice: 'Message was successfully updated.' } format.json { render :show, status: :ok, location: @message } else format.html { render :edit } format.json { render json: @message.errors, status: :unprocessable_entity } end end end # DELETE /messages/1 # DELETE /messages/1.json def destroy @message.destroy respond_to do |format| format.html { redirect_to messages_url, notice: 'Message was successfully destroyed.' } format.json { head :no_content } end end private # Use callbacks to share common setup or constraints between actions. def set_message @message = Message.find(params[:id]) end . def message_params params.require(:message).permit(:name, :email, :company, :phone, :subject, :body) end end