Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 如何使用简单表单向控制器发送任意参数_Ruby On Rails_Ruby_Simple Form - Fatal编程技术网

Ruby on rails 如何使用简单表单向控制器发送任意参数

Ruby on rails 如何使用简单表单向控制器发送任意参数,ruby-on-rails,ruby,simple-form,Ruby On Rails,Ruby,Simple Form,我正在建立一个时事通讯管理表单,我想使用简单的表单。email参数应通过POST方法发送给email\u订户#managecontroller/action routes.rb get 'email/login' => 'email_subscribers#login', as: 'email_login' get 'email/manage' => 'email_subscribers#manage', as: 'email_manage' def login end def

我正在建立一个时事通讯管理表单,我想使用简单的表单。
email
参数应通过
POST
方法发送给
email\u订户#manage
controller/action

routes.rb

get 'email/login' => 'email_subscribers#login', as: 'email_login'
get 'email/manage' => 'email_subscribers#manage', as: 'email_manage'
def login

end

def manage
    @subscriber = EmailSubscriber.find_by_email(safe_params(:email))

    unless @subscriber
        # redirect_to email_login_path, notice: 'That email does not exist.'
    end
end
电子邮件\u订户\u控制器.rb

get 'email/login' => 'email_subscribers#login', as: 'email_login'
get 'email/manage' => 'email_subscribers#manage', as: 'email_manage'
def login

end

def manage
    @subscriber = EmailSubscriber.find_by_email(safe_params(:email))

    unless @subscriber
        # redirect_to email_login_path, notice: 'That email does not exist.'
    end
end
电子邮件/登录表单

<%= render :layout => 'application/container' do %>
    <%= simple_form_for(@subscriber, path: :email_manage_path, method: :get) do |f| %>
            <%= f.error_notification %>

            <div class="form-inputs">
                <%= f.input :email, as: :email %>
            </div>

            <div class="form-actions">
                <%= f.button :submit, value: 'Manage Subscription' %>
            </div>
    <% end %>
“应用程序/容器”do%>
登录路径是表单所在的位置。它允许用户输入他们的电子邮件以取消订阅时事通讯

表单应重定向到
管理
操作,传递没有相应模型的
电子邮件
参数

当前表单不工作。出于某种原因,它会重定向到
EmailSubscribers
索引页面。 将
email\u manage
路由更改为
POST
会导致
丢失路由POST-email/login
,这毫无意义,因为表单是发布到
email\u manage\u路径
,而不是
email\u-login\u路径

谢谢

编辑:

耙路由输出(在此同一选项卡中打开)


实际上,您可以将其建模为传统的RESTful资源:

resources :subscriptions
namespace :subscriptions do
  resources :logins
  get '/login', to: 'logins/create'
end
这样做的好处是,您可以获得一个遵循规范crud谓词的简单得多的设置,并且还可以使用正确的HTTP谓词

这里唯一非常规的部分是,我们通过GET向
create
添加了一条额外的路径:

# app/controllers/subscriptions/logins_controller.rb
class Subscriptions::LoginsController < ApplicationController
  rescue_from ActionController::ParameterMissing, with: :subscription_not_found

  # GET /subscriptions/logins/new
  def new
    @subscription = Subscription.new
  end

  # POST /subscriptions/logins
  # GET /subscriptions/login
  def create
    @subscription = Subscription.find_by_email(email_param)
    if @subscription
      redirect_to edit_subscription_path(@subscription)
    else
      subscription_not_found
    end
  end

  private

  def subscription_not_found
    render :new, error: 'Email could not be found.'
  end

  def email_param
    if request.post?
      params.require(:subscription).fetch(:email)
    else
      params.fetch(:email)
    end
  end
end
#app/controller/subscriptions/logins_controller.rb
类订阅::LoginsController
因为我们实际上是绑定到一个资源,所以您可以非常直接地设置表单。我们还添加了一个GET路由,允许用户直接从链接登录

形式非常直截了当

<%= simple_form_for(@subscription, path: subscriptions_sessions_path) do %>
  <%= f.error_notification %>

  <div class="form-inputs">
    <%= f.input :email, as: :email %>
  </div>

  <div class="form-actions">
    <%= f.button :submit, value: 'Manage Subscription' %>
  </div>
<% end %>

然后,您可以创建一个运行良好的CRUD控制器,允许用户编辑或取消订阅:

# app/controllers/subscriptions_controller.rb
class SubscriptionsController < ApplicationController

  before_action :set_subscription, only: [:edit, :update, :destroy]
  rescue_from ActiveRecord::RecordNotFound, with: :invalid_email

  def new
    @subscription = Subscription.new
  end

  def create
    @subscription = Subscription.new(subscription_params)
    if @subscription.save(subscription_params)
      redirect_to root_path, success: 'Your subscription settings have been creates'
    else
      render :new
    end
  end

  def edit
  end

  def update
    if @subscription.update(subscription_params)
      redirect_to root_path, success: 'Your subscription settings have been updated'
    else
      render :edit
    end
  end

  def destroy
    @subscription.destroy
    redirect_to root_path
  end

  private 

  def set_subscription
    @subscription = Subscription.find(params[:id])
  end

  def subscription_params
    params.require(:subscription).permit(:foo, :bar, :baz)
  end
end
#app/controllers/subscriptions_controller.rb
类订阅控制器<应用程序控制器
在\u操作之前:设置\u订阅,仅:[:编辑,:更新,:销毁]
使用::无效的\u电子邮件从ActiveRecord::RecordNotFound中解救\u
def新
@subscription=subscription.new
结束
def创建
@订阅=订阅。新建(订阅参数)
if@subscription.save(订阅参数)
重定向到根路径,成功:“您的订阅设置已创建”
其他的
渲染:新
结束
结束
定义编辑
结束
def更新
if@subscription.update(订阅参数)
重定向到根路径,成功:'您的订阅设置已更新'
其他的
渲染:编辑
结束
结束
def销毁
@订阅。销毁
将\重定向到根\路径
结束
私有的
def set_订阅
@subscription=subscription.find(参数[:id])
结束
def订阅参数
参数require(:subscription).permit(:foo,:bar,:baz)
结束
结束

您可以发布您的路线吗
rake routes
添加了一个带有完整的
rake routes
outputi的粘贴箱,我需要一些时间才能让它下沉。在技术上没有回答这个问题,因为我仍然想知道如何在没有模型的情况下使用simple_form,但我确实喜欢你的方法。非常聪明!现在将您的答案集成到我的应用程序中。通过创建一个包含
ActiveModel::model
的“虚拟”模型,您可以在没有表支持模型的情况下使用它,或者您只需使用普通的旧rails标记帮助器来创建输入元素。SF不是没有模型就可以工作的。另外,创建令牌是一个好主意,您可以在电子邮件中发送,而不是使用用户电子邮件作为参数。为什么
/login
路径会转到
会话#create
?是否应该转到
登录#创建