attr_accessor返回nil?

时间:2014-08-01 12:51:29

标签: ruby-on-rails ruby ruby-on-rails-4 attr-accessor

我想要一个临时属性,我可以在控制器中使用。
我认为attr_accessor是最好的方法。
但是当我提交users_binded - 输入时,会发生以下错误:

Template is missing: Missing template schedule/invite_now, application/invite_now with {:locale=>[:en], :formats=>[:html], :handlers=>[:erb, :builder, :raw, :ruby, :jbuilder, :coffee]}. Searched in: * ../views

我想在数据库中找到输入users_binded的用户,如控制器中所示 我不知道如何在控制器中使用临时属性。
它应该是Schedule.users_binded还是:users_binded还是其他什么?

时间表模型:

class Schedule < ActiveRecord::Base
  attr_accessor :users_binded
end


时间表视图:

<%= form_for @schedule_invite, :as => :schedule, :url => schedule_invite_path, :method => :post, :html => {:class => 'navbar-form', :role => 'login'} do |schedule_form_builder| %>
  <p>
    <strong>..Benutzer:</strong>
    <%= schedule_form_builder.text_field :users_binded, :class => 'form-control', :placeholder => 'Benutzer'%>
  </p>
  <p>
    <strong>Title:</strong><br>
    <%= @schedule_invite.title %>
  </p>
  <p>
    <strong>Ort:</strong><br>
    <%= @schedule_invite.location %>
  </p>
  <p>
    <strong>Datum und Uhrzeit:</strong><br>
    <%= @schedule_invite.date_time.strftime("%A, %d.%m.%Y") %>
    <%= @schedule_invite.date_time.strftime("%H:%M:%S") %>
  </p>
  <p class="pull-right">
    <%= link_to "Zurück", root_path, :class => 'btn btn-danger' %>&nbsp;
    <%= schedule_form_builder.submit 'Termin teilen?', :class => 'btn btn-success' %>
  </p>
<% end %>


时间表控制器:

class ScheduleController < ApplicationController
def invite_now
    begin #try
      #user_name = @schedule_invite.users_binded.to_s
      user_binded = User.find_by_name(:user_binded)
    rescue #catch
      if user_binded.nil?
        flash[:notice] = 'Der Benutzer konnte nicht gefunden werden.'
        @schedule_invite = current_user.schedules.find(params[:id])
        render :action => "invite"
      else
        @schedule_invite = user_binded.schedules.find(params[:id])
        user_binded.schedules << @schedule_invite
        flash[:notice] = 'Der Termin wird nun mit dem Benutzer ' + user_binded.name + 'geteilt.'
        redirect_to :root
      end
    end
  end
end


路线:

post "schedule/invite/:id" => "schedule#invite_now"

<小时/> 修改
我将控制器更改为:

def invite_now
    begin #try
      #user_name = @schedule_invite.users_binded.to_s
      user_binded = User.find_by_name(params[:user_binded])
    rescue #catch
      if user_binded.nil?
        flash[:notice] = 'Der Benutzer konnte nicht gefunden werden.'
        @schedule_invite = current_user.schedules.find(params[:id])
        render :action => "invite"
      end
    end

    if user_binded.nil?
      flash[:notice] = 'Der Benutzer konnte nicht gefunden werden.'
      @schedule_invite = current_user.schedules.find(params[:id])
      render :action => "invite"
    else
      @schedule_invite = user_binded.schedules.find(params[:id])
      user_binded.schedules << @schedule_invite
      flash[:notice] = 'Der Termin wird nun mit dem Benutzer ' + user_binded.name + 'geteilt.'
      redirect_to :root
    end
  end

所以我不需要invite_now.html.erb 发生的问题如下(可能存在attr_accessor问题):
SQL声明
user_binded = User.find_by_name(params[:user_binded])
回报/负载
User Load (1.0ms) SELECT "users".* FROM "users" WHERE "users"."name" IS NULL LIMIT 1
以便attr_accessor不正确?
正如 Doon 所说:“attr_accsessor将在实例上使用。”

解决方案是否如下?

@schedule_invite = current_user.schedules.find(params[:id])
@schedule_invite.user_binded = User.find_by_name(params[:users_binded])

只有属性类型可以是一切(例如用户类型)才有意义 有任何想法吗 ?

<小时/> 的 EDIT2:
我尝试使用以下内容检查params[:users_binded]
flash[:notice] = params[:users_binded]
并发生此错误:
can't convert nil into String,以便param users_binded不会被正确设置
RAJ ...... 说我应该在这个问题上添加参数:

private
def schedule_params
  params.require(:schedule).permit(:id, :titel, :location, :date_time)
end

我认为这是问题..

1 个答案:

答案 0 :(得分:1)

问题根本与attr_accessor无关。那很好。问题在于模板渲染。

因此,您需要在invite_now.html.erb目录

中添加模板视图views/schedule/

比你的控制器:

您需要使用params[:schedule][:users_binded]代替:user_binded。所以它就像

 user_binded = User.find_by_name(params[:schedule][:users_binded])